>>> (1).__len__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__len__'
>>> len(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()
可以认为len()大致相当于
一个优点是它允许你写
而不是
或者
不过,他们的行为略有不同。 例如在ints的情况下
len
是获取集合长度的函数。它通过调用对象的__len__
方法来工作。__something__
属性是特殊的,通常比肉眼看到的要多,通常不应该直接调用。很早以前就决定了,得到某个东西的长度应该是一个函数,而不是一个方法代码,理由是
len(a)
的含义对于初学者来说是很清楚的,但是a.len()
就不那么清楚了。当Python启动时,__len__
甚至不存在,len
是一个特殊的东西,它可以处理几种类型的对象。不管这种情况是否让我们完全有意义,它是在这里留下来的。通常情况下,内置或运算符的“典型”行为是在所涉及的对象上调用(使用不同且更好的语法)合适的magic方法(名称类似于
__whatever__
)。通常,内置或运算符具有“附加值”(它可以根据所涉及的对象采用不同的路径)--在len
与__len__
的情况下,它只是对magic方法缺少的内置进行了一点健全性检查:当您看到对内置的
len
的调用时,您肯定如果程序在该调用之后继续而不是引发异常,则该调用返回了一个整数、非负且小于2**31--当您看到对xxx.__len__()
的调用时,您不确定(除了代码的作者不熟悉Python或不太擅长;-)。除了简单的健全性检查和可读性之外,其他内置组件还提供了更多的附加值。通过统一地设计所有的Python,通过调用内置函数和使用操作符来工作,而不是通过调用魔术方法来工作,程序员就免去了记住哪种情况的负担。(有时会出现一个错误:在2.5之前,您必须在2.6中调用
foo.next()
——虽然这仍然适用于向后兼容,但您应该调用next(foo)
,在3.*
中,magic方法正确命名为__next__
,而不是“oops ey”next
!-).因此,一般规则应该是永远不要直接调用magic方法(但总是通过内置的方法间接调用),除非您确切地知道为什么需要这样做(例如,当您在子类中重写此类方法时,如果子类需要遵从必须通过显式调用magic方法来完成的超类)。
相关问题 更多 >
编程相关推荐