为什么'len'函数不是由Python中的字典和列表继承的

Fra*_*ard 17 python

例:

a_list = [1, 2, 3]
a_list.len() # doesn't work
len(a_list) # works
Run Code Online (Sandbox Code Playgroud)

Python(非常)面向对象,我不明白为什么'len'函数不会被对象继承.另外,我一直在尝试错误的解决方案,因为它对我来说似乎是合乎逻辑的

Jim*_*Jim 41

圭多的解释是在这里:

首先,为了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'是一种内置操作.我不想失去那个./ ...... /

  • 对于那些不知道的人,HCI代表人机界面.因此,当Guido说他做出了"HCI原因"的决定时,他说他认为它使代码更具可读性. (23认同)
  • Guido 认为泛型函数比方法更好。令人难以置信。:/ (2认同)

Nat*_*ate 11

事实并非如此.

但是,您可以这样做:

>>> [1,2,3].__len__()

3
Run Code Online (Sandbox Code Playgroud)

__len__()类添加方法是len()神奇工作的原因.


Eli*_*ght 11

简短的回答:1)向后兼容性和2)真正重要的是它没有足够的差别.有关更详细的说明,请继续阅读.

这种操作的惯用Python方法是特殊方法,不能直接调用.例如,要x + y为自己的类创建工作,可以编写一个__add__方法.要确保int(spam)正确转换自定义类,请编写__int__方法.为了确保len(foo)做一些合理的事情,写一个__len__方法.

这就是Python一直以来的情况,我认为它对某些事情很有意义.特别是,这似乎是实现运算符重载的合理方法.至于其余的,不同的语言不一致; 在Ruby中你通过spam.to_i直接调用而不是说来将某些东西转换为整数int(spam).

你是对的,Python是一种非常面向对象的语言,并且必须在对象上调用外部函数才能获得它的长度似乎很奇怪.另一方面,len(silly_walks)并不比任何更繁重silly_walks.len(),并且Guido说他实际上更喜欢它(http://mail.python.org/pipermail/python-3000/2006-November/004643.html).

  • 啊......这终于理解了这一切.len()更像是一个函数的运算符,真的. (3认同)

dF.*_*dF. 5

这种方式可以更好地适应其他语言.python中的约定是您__foo__向对象添加特殊方法以使它们具有某些功能(而不是例如从特定基类派生).例如,一个对象是

  • 如果它有__call__方法 可调用
  • 如果它有一个__iter__方法可迭代,
  • 支持访问[]如果有__getitem____setitem__.
  • ...

这些特殊方法之一是__len__使其具有可访问的长度len().