gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:27:06 24 4
gpt4 key购买 nike

如果我按如下方式定义 __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() 不可迭代。

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

class A:

def __init__(self):

self.__class__.__iter__ = staticmethod(lambda: iter('text'))
# or:
# self.__class__.__iter__ = lambda s: iter('text')


for i in A():
print(i)

iter(A())

# will print:
# t
# e
# x
# t

有谁知道python为什么要这样设计?即为什么 __iter__ 作为实例变量不起作用?你不觉得它不直观吗?

最佳答案

这是设计使然。您可以在此处找到详细说明:https://docs.python.org/3/reference/datamodel.html#special-method-lookup

简短回答:必须在类对象本身上设置特殊方法,以便解释器始终如一地调用它。

长答案:这背后的想法是加快众所周知的 build 。在你的例子中:

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

在现实生活中,您打算多久编写一次这样的代码?所以,Python 所做的 - 它跳过了实例的字典查找,即 iter(A()) 根本没有“看到” self.__iter__,这实际上是self.__dict__['__iter__'] 在这种情况下。

它还跳过所有 __getattribute__ 实例和元类查找,从而获得显着的加速。

关于python - 为什么 `__iter__` 定义为实例变量时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43346584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com