이해할 수 있듯이 __iter__
메서드를 사용하여 반복기를 반환하는 개체에 for
루프 구성을 사용할 수 있습니다.파이썬 __iter__ 및 for 루프
def __getattribute__(self,name):
if name in ["read","readlines","readline","seek","__iter__","closed","fileno","flush","mode","tell","truncate","write","writelines","xreadlines"]:
return getattr(self.file,name)
return object.__getattribute__(self,name)
내가 a
이되는 다음과 같은 상황이 발생,이 클래스의 객체를 가지고 :
>>> hasattr(a,"__iter__")
True
>>> for l in a: print l
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'TmpFile' object is not iterable
>>> for l in a.file: print l
...
>>>
그래서 파이썬은 a
가 __iter__
을 가지고보고 난 다음 __getattribute__
메소드를 구현하는 객체를 가지고 메서드를 호출하지만 iterable이라고는 생각하지 않습니다. 나는 무엇을 잘못 했는가? 이것은 파이썬 2.6.4와 같습니다.
일을 ... 그들이 말하는대로, 당신은 매일 새로운 것을 배웁니다. :) – delnan
+1 그리고 어떤 delnan이 말하는지. – slezica
적어도 CPython에서이 부작용을 볼 수 있습니다 :'__getattribute__'를 정의하면'iter'를 사용할 때'__class__'가 호출된다는 것을 알게 될 것입니다. 런타임은 '__iter__ '를 호출하는 객체의 클래스. (이것은 구현 세부 사항으로 간주되어야합니다.) –