例:
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'是一种内置操作.我不想失去那个./ ...... /
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).
这种方式可以更好地适应其他语言.python中的约定是您__foo__向对象添加特殊方法以使它们具有某些功能(而不是例如从特定基类派生).例如,一个对象是
__call__方法 可调用__iter__方法可迭代,__getitem__和__setitem__.这些特殊方法之一是__len__使其具有可访问的长度len().