[問題] 使用__dict__["__setattr__"]取代現有的類別函數

看板Python作者 ( hua)時間13年前 (2010/12/08 17:48), 編輯推噓2(206)
留言8則, 2人參與, 最新討論串1/1
操作物件內的__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

12/11 06:08, , 1F
我也想知道答案, 我發現 aObj.var = 1 在這裡似乎是變
12/11 06:08, 1F

12/11 06:09, , 2F
成 setattr(aObj, 'var', 1) 而不是
12/11 06:09, 2F

12/11 06:10, , 3F
aObj.__setattr__('var', 1)
12/11 06:10, 3F

12/11 06:46, , 4F
山不轉路轉, 你換整個函式不行, 那換掉函式內部的碼,總
12/11 06:46, 4F

12/11 06:47, , 5F
可以了吧.你試 aKlass.__setattr__.im_func.fun_code =\
12/11 06:47, 5F

12/11 06:48, , 6F
new_setattr_fn.func_code 把函式內的執行碼換掉,應該可
12/11 06:48, 6F

12/11 16:58, , 7F
我是可以覆蓋aKlass.__setattr__, 使用setattr.
12/11 16:58, 7F

12/11 16:59, , 8F
只是好奇, __dict__在這個情況下失效的原因
12/11 16:59, 8F
文章代碼(AID): #1C_rHWtE (Python)