2016-05-12 64 views
0

比方說,一個人想項目分配從國外庫添加到一個類的實例:Python的補丁項目分配

# defined outside our code base 
class WeDoNotWantToDeriveThis(object): pass 


inst = WeDoNotWantToDeriveThis() 
def set_item_func(self, idx, val): print("hi there") 
import types 
# try to patch item setter 
inst.__setitem__ = types.MethodType(set_item_func, inst) 
assert hasattr(inst, '__setitem__') 
print(type(inst.__setitem__)) # prints "instancemethod" 
# try to perform item assignment on inst 
inst[0] = None # raises 'object does not support item assignment' 

的問題是如何正確地做到這一點。也許'setitem'沒有在實例上查找,但在類本身上檢查對象是否支持項目分配?

根據該文件,執行setitem方法應該是足夠了: https://docs.python.org/3/reference/datamodel.html#object.setitem

+0

儘量實現'__getitem__'代替。 –

+1

爲什麼不是子類而不是猴子修補? – jonrsharpe

+0

因爲這將需要太多的代碼更改。它現在應該是一個簡單的解決方法。 – marscher

回答

1

必須設置在類的實例方法:

>>> WeDoNotWantToDeriveThis.__setitem__ = types.MethodType(set_item_func, None, WeDoNotWantToDeriveThis) 
>>> inst[0] = None 
hi there 
>>> 
+0

我真的必須修補實例(如果可能的話),因爲我不想爲該特定庫的其他用戶引入副作用。 – marscher

+1

不可能有副作用,因爲項目分配僅供您使用。或者你重寫默認的項目分配? –

+0

你的代碼在Python3中引發了:TypeError:方法預期2個參數,得到3 – marscher