python:这个有趣的符号是什么? [0,1,3] .__ LEN __()

时间:2010-08-09 22:17:48

标签: python

  1. 为什么有人会使用双下划线
  2. 为什么不做len([1,2,3])
  3. 我的问题是 强调意味着什么?

4 个答案:

答案 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时停止工作。