为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Python代码使用len()函数而不是length方法?

为什么Python代码使用len()函数而不是length方法?

慕田峪7331174 2019-09-02 09:00:26
我知道python有一个len()用于确定字符串大小的函数,但我想知道为什么它不是字符串对象的方法。更新好吧,我意识到我很尴尬。__len__()实际上是一个字符串对象的方法。使用字符串对象上的len函数在Python中看到面向对象的代码似乎很奇怪。此外,__len__将名称视为名称而不仅仅是len 也是奇怪的。
查看完整描述

3 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

字符串确实有一个长度方法: __len__()


Python中的协议是在具有长度的对象上实现此方法,并使用内置len()函数为您调用它,类似于您实现__iter__()和使用内置iter()函数的方式(或者使用后面的方法)对于可迭代的对象,你的场景。


有关更多信息,请参阅模拟容器类型。


以下是关于Python协议主题的很好的阅读:Python和最小惊讶原则


查看完整回答
反对 回复 2019-09-02
?
繁花如伊

TA贡献2012条经验 获得超12个赞

吉姆对这个问题的回答可能有所帮助; 我把它复制在这里。引用Guido van Rossum:

首先,为了HCI的原因,我选择了len(x)而不是x.len()(def __len __()来得晚了)。实际上有两个相互交织的原因,都是人机交互:

(a)对于某些操作,前缀表示法只比读后缀更好 - 前缀(和中缀!)操作在数学中有悠久的传统,它喜欢视觉效果帮助数学家思考问题的符号。比较我们将x *(a + b)等公式重写为x a + x b的简单性,以及使用原始OO表示法做同样事情的笨拙。

(b)当我读到代码为len(x)的代码时,我知道它是在询问某些东西的长度。这告诉我两件事:结果是一个整数,参数是某种容器。相反,当我读取x.len()时,我必须知道x是某种实现接口的容器,或者是从具有标准len()的类继承的。当没有实现映射的类具有get()或keys()方法,或者不是文件的类具有write()方法时,见证我们偶尔会遇到的混淆。

用另一种方式说同样的事情,我认为'len'是一种内置操作。我不想失去那个。/ ...... /


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 4506 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信