如果我按如下方式定义&[T; n]
方法,则无法工作:
&[T]
结果:
__iter__
如您所见,调用class A:
def __init__(self):
self.__iter__ = lambda: iter('text')
for i in A().__iter__():
print(i)
iter(A())
有效,但t
e
x
t
Traceback (most recent call last):
File "...\mytest.py", line 10, in <module>
iter(A())
TypeError: 'A' object is not iterable
不可迭代。
但是,如果我为该类定义A().__iter__()
,那么它将起作用:
A()
有谁知道为什么python的设计是这样的?即为什么__iter__
作为实例变量不起作用?你发现它不直观吗?
答案 0 :(得分:5)
它是通过设计完成的。您可以在此处找到详细说明:https://docs.python.org/3/reference/datamodel.html#special-method-lookup
简短回答:必须在类对象本身上设置特殊方法,以便由解释器一致地调用。
答案很长:这背后的想法是加快众所周知的结构。在您的示例中:
class A:
def __init__(self):
self.__iter__ = lambda: iter('text')
你多久会在现实生活中写出这样的代码?所以,Python做了什么 - 它跳过实例的字典查找,即iter(A())
根本没有“看到”self.__iter__
,在这种情况下实际上是self.__dict__['__iter__']
。
它还会跳过所有__getattribute__
实例和元类查找,从而获得显着的加速。