Я хочу обернуть каждый метод различных объектов, кроме __ 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"
Кажется, что атрибуты объекта свойства доступны только для чтения, предотвращая изменение функции после того, как свойство обернуло ее. Я не слишком доволен уровнем хакерства, который уже требуется, и я бы предпочел не вникать в объект свойства.
Единственное другое решение, которое я вижу, - это создание метакласса на лету, чего я надеялся избежать . Я упустил что-то очевидное?