len([1,2,3])
?我的问题是 强调意味着什么?
答案 0 :(得分:4)
__len__()
是使用len()
时调用的特殊Python方法。
这与str()
使用__str__()
,repr
使用__repr__()
等非常相似。您可以在类中重载它以为len()
提供自定义行为当在你班级的一个实例上使用时。
见这里:http://docs.python.org/release/2.5.2/ref/sequence-types.html:
__len__(self)
被调用来实现内置函数len()
。应该回来 对象的长度,整数> = 0 此外,一个没有定义__nonzero__()
方法的对象 其__len__()
方法返回零是 在布尔值中被认为是假的 上下文。
答案 1 :(得分:2)
如果你“绝对必须”将其称为方法(而不是函数),则需要双下划线。但是我能想到的代码的唯一动机是,有些人已经非常高兴他们不理解你不直接调用特殊方法的关键Python原则(除非你可能需要调用你的超类的版本)如果你正在覆盖它,当然) - 你使用适当的内置或运算符,它调用(内部)需要任何特殊方法。
实际上,在你展示的代码中,唯一明智的做法就是使用常量3
,所以也许你的例子过于简单了......? - )
答案 2 :(得分:2)
您应该阅读special method names上的文档。
答案 3 :(得分:2)
我必须使用x.__len__()
而不是len(x)
的一个原因是len
只能返回int
而__len__
的限制可以退货。
您可能会合理地争辩只返回一个整数 ,但如果对象的长度大于sys.maxsize
,那么除了返回{{1}之外别无选择而是:
long
这不仅仅是一个理论上的限制,我已经对位容器做了大量工作,其中(使用32位Python)>>> class A(object):
... def __len__(self):
... return 2**80
...
>>> a = A()
>>> len(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: long int too large to convert to int
>>> a.__len__()
1208925819614629174706176L
函数在对象达到256MB时停止工作。