当定义为实例变量时,为什么“uuIter”不起作用?

2024-04-19 15:03:00 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我按如下方式定义__iter__方法,它将不起作用:

class A:

    def __init__(self):
        self.__iter__ = lambda: iter('text')


for i in A().__iter__():
    print(i)

iter(A())

结果:

^{pr2}$

如您所见,调用A().__iter__()起作用,但A()不可执行。在

但是,如果我为类定义__iter__,那么它将起作用:

^{3}$

有人知道为什么python被设计成这样吗?i、 为什么__iter__作为实例变量不起作用?你不觉得这不直观吗?在


Tags: 实例方法lambdatextinselffor定义
1条回答
网友
1楼 · 发布于 2024-04-19 15:03:00

这是精心设计的。您可以在这里找到完整的描述: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__实例和元类查找,获得了显著的加速。在

相关问题 更多 >