【发布时间】:2017-09-06 21:06:26
【问题描述】:
如果我将__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__ 作为实例变量不起作用?你不觉得它不直观吗?
【问题讨论】:
-
我认为您尝试这样做的方式非常不直观,为什么不直接将 iter 重写为方法? stackoverflow.com/questions/4019971/…
-
似乎是旧式与新式类的问题。您的代码不适用于新式类。
-
@PyNico 在我目前正在处理的特定情况下,我更喜欢在
__init__中定义__iter__,因为它的实现取决于实例化参数。