def decorator(fn):
def wrapper(*args, **kwargs):
print 'With sour cream and chives!',
return fn(*args, **kwargs)
return wrapper
class Potato(object):
def __call__(self):
print 'Potato @ {} called'.format(id(self))
spud = Potato()
fancy_spud = decorator(Potato())
Con questo codice abbiamo due istanze della classe callable, uno è decorata e uno è semplice:Come posso decorare un'istanza di una classe richiamabile?
>>> spud()
Potato @ 140408136280592 called
>>> fancy_spud()
With sour cream and chives! Potato @ 140408134310864 called
mi chiedo se è in qualche modo supportato per utilizzare la sintassi @decorator
su un callable per un solo esempio, - al contrario di decorare la classe/metodo, che si applicherebbe ad ogni istanza. Secondo this risposta popolare, il @syntax è solo zucchero per:
function = decorator(function)
Ma è una semplificazione eccessiva? Con tutti i miei tentativi a metà forno sembra funzionare solo quando la sintassi si verifica prima di def
, class
, spazio bianco o @another_decorator
.
@decorator
baked = Potato()
Questo è un SyntaxError
.
baked = Potato()
@decorator
baked
SyntaxError
.
@decorator
def baked(_spud=Potato()):
return _spud()
Funziona, ma è brutto e un pò barare.