如何修改__dict__类(映射代理)?[重复]
这个问题已经在这里有了答案 :
如何通过__dict__分配新的类属性? (1个答案)
6年前关闭。
我想将装饰器应用于类中的每个方法。我没有该类的源代码,因此无法直接应用装饰器。我想调用一些接受类并添加装饰器的函数。
但是问题是testclass.__dict__
一个mappingproxy
对象,它至少不直接支持任何赋值或修改。所以问题是如何避免这种限制并应用装饰器?
这是失败尝试的代码:
class qwer:
def test(self):
print('test')
def decor(func):
def w(*args, **named_args):
print('decor')
func(*args, **named_args)
return w
qwer.__dict__['test'] = decor(qwer.__dict__['test'])
错误:
TypeError: 'mappingproxy' object does not support item assignment
-
用于
setattr
在类上设置属性:>>> setattr(qwer, 'test', decor(qwer.__dict__['test'])) >>> qwer.test <function decor.<locals>.w at 0xb5f10e3c>
演示:
>>> class A: pass ... >>> A.__dict__['foo'] = 'bar' Traceback (most recent call last): File "<ipython-input-117-92c06357349d>", line 1, in <module> A.__dict__['foo'] = 'bar' TypeError: 'mappingproxy' object does not support item assignment >>> setattr(A, 'foo', 'bar') >>> A.foo 'bar'