如果我按如下方式定义__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__
,那么它将起作用:
有人知道为什么python被设计成这样吗?i、 为什么__iter__
作为实例变量不起作用?你不觉得这不直观吗?在
这是精心设计的。您可以在这里找到完整的描述:https://docs.python.org/3/reference/datamodel.html#special-method-lookup
简而言之:特殊方法必须设置在类对象本身上,这样解释器才能一致地调用它。在
长话短说:这背后的想法是加快知名度建设。在您的例子中:
在现实生活中,你多久会写一次这样的代码?所以,Python所做的-它跳过实例的字典查找,即
iter(A())
只是没有“看到”那个self.__iter__
,在本例中实际上是self.__dict__['__iter__']
。在它还跳过了所有的
__getattribute__
实例和元类查找,获得了显著的加速。在相关问题 更多 >
编程相关推荐