看板 Python 關於我們 聯絡資訊
操作物件內的__dict__字典相當於操作物件內的屬性存取. 雖然仍有些不同. obj.__dict__[name] = value # obj.name = value 然而以 obj.__dict__["__setattr__"] = new_fn 來取代現有的 __setattr__ 時 遇到一個問題(使用python2.6): class aKlass: var = 0 def a_fn(self): print "aKlass.a_fn" def __setattr__(self, name, value): print "aKlass.__setattr__",name,value def new_a_fn(self): print "new_a_fn" def new_setattr_fn(self,name,value): print "new_setattr_fn",name,value aKlass內含兩個函數, a_fn, __setattr__. 另準備兩個對應的函數new_a_fn, new_setattr_fn 希望使用aKlass.__dict__[ ]的方式取代 -- aObj = aKlass() aObj.a_fn() aKlass.__dict__["a_fn"] = new_a_fn aObj.a_fn() aObj.var = 1 aKlass.__dict__["__setattr__"] = new_setattr_fn aObj.var = 1 執行結果: aKlass.a_fn new_a_fn aKlass.__setattr__ var 1 aKlass.__setattr__ var 1 aKlass.__dict__["a_fn"] = new_a_fn 的確用new_a_fn取代了原先的a_fn. 但似乎 aKlass.__dict__["__setattr__"] = new_setattr_fn 沒有達到預期的效果. 不知原因為何? (雖然使用 setattr(aKlass,"__setattr__",new_setattr_fn) 就可以取代原函數了.) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.20.60.207
jacobcrab:我也想知道答案, 我發現 aObj.var = 1 在這裡似乎是變 12/11 06:08
jacobcrab:成 setattr(aObj, 'var', 1) 而不是 12/11 06:09
jacobcrab:aObj.__setattr__('var', 1) 12/11 06:10
jacobcrab:山不轉路轉, 你換整個函式不行, 那換掉函式內部的碼,總 12/11 06:46
jacobcrab:可以了吧.你試 aKlass.__setattr__.im_func.fun_code =\ 12/11 06:47
jacobcrab:new_setattr_fn.func_code 把函式內的執行碼換掉,應該可 12/11 06:48
rexrainbow:我是可以覆蓋aKlass.__setattr__, 使用setattr. 12/11 16:58
rexrainbow:只是好奇, __dict__在這個情況下失效的原因 12/11 16:59