[英]Python __iter__ and for loops
據我了解,我可以使用帶有__iter__
方法的對象的for
循環構造來返回迭代器。 我有一個對象,我實現了以下__getattribute__
方法:
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
...
>>>
所以python看到a
有一個__iter__
方法,但不認為它是可迭代的。 我做錯了什么? 這是python 2.6.4。
有一個微妙的實現細節妨礙你: __iter__
實際上不是一個實例方法,而是一個類方法。 也就是說, obj.__class__.__iter__(obj)
,而不是obj.__iter__()
。
這是由於引擎優化,允許Python運行時更快地設置迭代器。 這是必需的,因為迭代器盡可能快地非常重要。
無法為基礎class
類型定義__getattribute__
,因此無法動態返回此方法。 這適用於大多數__metamethods__
; 你需要寫一個實際的包裝器。
某些特殊方法在創建類時已經過優化,無法在以后添加或通過賦值覆蓋。 請參閱__getattribute__
的文檔 ,其中說明:
當通過語言語法或內置函數進行隱式調用查找特殊方法時,仍然可以繞過此方法。
在這種情況下,您需要做的是提供轉發呼叫的__iter__
的直接實現:
def __iter__(self):
return self.file.__iter__()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.