如果我定義了__iter__
方法如下,它不會工作:爲什麼`__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__作爲一種方法? http://stackoverflow.com/questions/4019971/how-to-implement-iter-self-for-a-container-object-python – PyNico
似乎是一種舊式vs新式的課堂問題。你的代碼不適用於新風格的類。 – timgeb
@PyNico在我目前正在處理的特定情況下,我更喜歡在'__init__'內定義'__iter__',因爲它的實現取決於實例化參數。 – AXO