作者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
1F:推 jacobcrab:我也想知道答案, 我发现 aObj.var = 1 在这里似乎是变 12/11 06:08
2F:→ jacobcrab:成 setattr(aObj, 'var', 1) 而不是 12/11 06:09
3F:→ jacobcrab:aObj.__setattr__('var', 1) 12/11 06:10
4F:推 jacobcrab:山不转路转, 你换整个函式不行, 那换掉函式内部的码,总 12/11 06:46
5F:→ jacobcrab:可以了吧.你试 aKlass.__setattr__.im_func.fun_code =\ 12/11 06:47
6F:→ jacobcrab:new_setattr_fn.func_code 把函式内的执行码换掉,应该可 12/11 06:48
7F:→ rexrainbow:我是可以覆盖aKlass.__setattr__, 使用setattr. 12/11 16:58
8F:→ rexrainbow:只是好奇, __dict__在这个情况下失效的原因 12/11 16:59