作者rexrainbow ( hua)
看板Python
標題[問題] 使用__dict__["__setattr__"]取代現有的類別函數
時間Wed Dec 8 17:48:14 2010
操作物件內的__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