为什么`__iter__`在定义为实例变量时不起作用?

时间:2017-04-11 12:56:38

标签: python iteration iterable

如果我按如下方式定义&[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__作为实例变量不起作用?你发现它不直观吗?

1 个答案:

答案 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__实例和元类查找,从而获得显着的加速。