Gdybym zdefiniować metodę __iter__
następująco, to nie będzie działać:Dlaczego `__iter__` nie działa, gdy jest zdefiniowane jako zmienna instancji?
class A:
def __init__(self):
self.__iter__ = lambda: iter('text')
for i in A().__iter__():
print(i)
iter(A())
Wynik:
t
e
x
t
Traceback (most recent call last):
File "...\mytest.py", line 10, in <module>
iter(A())
TypeError: 'A' object is not iterable
Jak widać, wzywającą A().__iter__()
działa, ale A()
nie jest iterable.
Jednak gdybym określić __iter__
dla klasy, to będzie działać:
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
Czy ktoś wie dlaczego pyton został zaprojektowany w taki sposób? tj. dlaczego __iter__
jako zmienna instancji nie działa? Nie uważasz, że to nieintuicyjne?
Myślę, że sposób, w jaki próbujesz to zrobić w sposób bardzo niezrozumiały, dlaczego po prostu nie zastąpisz __iter__ jako metody? http://stackoverflow.com/questions/4019971/how-to-implement-iter-self-for-a-container-object-python – PyNico
Wygląda na to, że jest klasą klasyczną w starym stylu lub w nowym stylu. Twój kod nie działa z klasami nowego stylu. – timgeb
@PyNico W szczególnym przypadku, nad którym obecnie pracuję, wolę zdefiniować '__iter__' wewnątrz' __init__', ponieważ jego implementacja zależy od argumentów instancji. – AXO