簡體   English   中英

Python __iter__和for循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM