A property
объект является дескриптором. Чтобы получить из него значение, вам нужно вызвать его метод __get__
с соответствующим экземпляром. Выяснить, когда это сделать в вашем текущем коде, непросто, поскольку ваш Decorator
объект выполняет множество разных ролей. Это и фабрика декораторов (инициализируемая аргументом в строке @Decorator(x)
), и сам декоратор (вызываемый с помощью функции, подлежащей декорированию). Вы дали ему метод __get__
, но я не ожидаю, что он когда-либо будет использоваться, поскольку экземпляр Decorator
никогда не будет назначен переменной класса (только функция-обертка, которая возвращается из __call__
).
В любом случае, вот модифицированная версия, где Decorator
обрабатывает почти все части самого протокола дескриптора:
class Decorator:
def __init__(self, arg):
self.arg = arg # this might be a descriptor, like a property or unbound method
def __call__(self, func):
self.func = func
return self # we still want to be the descriptor in the class
def __get__(self, instance, owner):
try:
arg = self.arg.__get__(instance, owner) # try to bind the arg to the instance
except AttributeError: # if it doesn't work, self.arg is not a descriptor, that's OK
arg = self.arg
def wrapper(*args, **kwargs): # this is our version of a bound method object
print(arg) # do something with the bound arg here
return self.func.__get__(instance, owner)(*args, **kwargs)
return wrapper