Декорирование метода класса после @property

Я хочу обернуть каждый метод различных объектов, кроме __ init __ с использованием декоратора.

class MyObject(object):

    def method(self):
        print "method called on %s" % str(self)

    @property
    def result(self):
        return "Some derived property"

def my_decorator(func):
    def _wrapped(*args, **kwargs):
        print "Calling decorated function %s" % func
        return func(*args, **kwargs)
    return _wrapped


class WrappedObject(object):

    def __init__(self, cls):
        for attr, item in cls.__dict__.items():
            if attr != '__init__' and (callable(item) or isinstance(item, property)):
                setattr(cls, attr, my_decorator(item))
        self._cls = cls

    def __call__(self, *args, **kwargs):
        return self._cls(*args, **kwargs)

inst = WrappedObject(MyObject)()

Однако упаковка результатов экземпляра свойства эквивалентна следующему:

@my_decorator
@property
def result(self):
    return "Some derived property"

Когда желаемый результат эквивалентен следующему:

@property
@my_decorator
def result(self):
    return "Some derived property"

Кажется, что атрибуты объекта свойства доступны только для чтения, предотвращая изменение функции после того, как свойство обернуло ее. Я не слишком доволен уровнем хакерства, который уже требуется, и я бы предпочел не вникать в объект свойства.

Единственное другое решение, которое я вижу, - это создание метакласса на лету, чего я надеялся избежать . Я упустил что-то очевидное?

8
задан DzinX 7 February 2011 в 16:42
поделиться