2013-11-16 2 views
6

Я хочу применить декоратор к каждому методу в классе. У меня нет исходного кода класса, поэтому я не могу напрямую применить декоратор. Я хочу вызвать некоторую функцию, которая принимает класс и добавляет декораторы.изменить класс __dict__ (mappingproxy) в python

Но проблема в том, что 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 

ответ

5

Использование 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' 
+0

AttributeError: атрибут readonly – Tcll

Смежные вопросы