如何修改__dict__类(映射代理)?[重复]

发布于 2021-01-29 16:08:28

这个问题已经在这里有了答案

如何通过__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
关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看