我試圖使用types.MethodType來修改某些迭代器的行爲。types.MethodType和for循環
def parse(line):
return line.upper()
def reader(f):
f.__next__ = types.MethodType(lambda x: parse(_io.TextIOWrapper.readline(x)), f)
f.__iter__ = types.MethodType(lambda x: x, f)
return f
我想我正確地使用types.MethodType,因爲運行下面的代碼我得到預期的結果:
>>with open("myfile.txt") as f:
>> x = reader(f)
>> print(f.__next__())
NORMAL LINE
然而,當我使用for循環,似乎不調用parse()函數。
>>with open("myfile.txt") as f:
>> for line in reader(f):
>> print(line)
normal line
這是因爲如果for循環使用,而不是覆蓋我的一個對象的原始下一個()方法。
我在這裏錯過了什麼?我知道我可以以更簡單的方式實現相同的結果,例如在reader()中產生分析的行,但是我真的更喜歡返回這個'裝飾'文件對象。
在此先感謝。
在'file'實例上更改方法不太可能;解釋器會在某些地方注意到何時存在內置類型,並快速切入某些方法查找。對於被設計爲子分類的'dict',它將爲覆蓋這些方法的子類執行「正確」的事情。但'file'不是爲此設計的。你運氣不好。 – SingleNegationElimination 2014-09-02 00:38:59
@IfLoop你寫的是假的。 *解釋器*不會**「優化對內置插件的查找」。當它們被隱式調用時(例如在for循環中),它將* all *訪問*特殊方法*。然而,這是爲所有**類,而不僅僅是內置的,所以即使是繼承'file'代碼也能正常工作。你所描述的是用C編寫的其他*函數,它可能已經被優化了,但是這與手頭的問題和例子完全無關。 – Bakuriu 2014-09-02 07:29:17