如何修改类dict(mappingproxy)?

2024-06-16 09:56:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想对类中的每个方法应用一个decorator。我没有类的源代码,所以不能直接应用decorator。我想调用一些接受类并添加装饰器的函数。

但问题是testclass.__dict__是一个mappingproxy对象,它不支持任何赋值或修改,至少是直接的。所以问题是如何避免这种刺激性的限制并应用decorator?

以下是失败尝试的代码:

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

Tags: 方法函数test源代码defargs装饰decorator
1条回答
网友
1楼 · 发布于 2024-06-16 09:56:20

使用^{}设置类的属性:

>>> 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'

相关问题 更多 >