Sì, è zucchero sintattico. Tutto può essere realizzato senza di loro, ma con poche altre righe di codice. Ma ti aiuta a scrivere codice più conciso.
Esempi:
from functools import wraps
def requires_foo(func):
@wraps(func)
def wrapped(self, *args, **kwargs):
if not hasattr(self, 'foo') or not self.foo is True:
raise Exception('You must have foo and be True!!')
return func(self, *args, **kwargs)
return wrapped
def requires_bar(func):
@wraps(func)
def wrapped(self, *args, **kwargs):
if not hasattr(self, 'bar') or not self.bar is True:
raise Exception('You must have bar and be True!!')
return func(self, *args, **kwargs)
return wrapped
class FooBar(object):
@requires_foo # Make sure the requirement is met.
def do_something_to_foo(self):
pass
potremmo anche catena/stack le decoratori uno sopra l'altro.
class FooBar(object):
@requires_bar
@requires_foo # You can chain as many decorators as you want
def do_something_to_foo_and_bar(self):
pass
OK, abbiamo potuto finire con un sacco di decoratori uno sopra l'altro.
Lo so! Scriverò un decoratore che applica altri decoratori.
Così abbiamo potuto fare questo:
def enforce(requirements):
def wrapper(func):
@wraps(func)
def wrapped(self, *args, **kwargs):
return func(self, *args, **kwargs)
while requirements:
func = requirements.pop()(func)
return wrapped
return wrapper
class FooBar(object):
@enforce([reguires_foo, requires_bar])
def do_something_to_foo_and_bar(self):
pass
Questo è un piccolo campione solo per giocare con.
C'è una risposta completa con esempi di utilizzo qui http://stackoverflow.com/questions/739654/understanding-python-decorators#answer-1594484 –
Grazie. È davvero utile Non so come chiudere o cancellare questo post. Se qualcuno può farlo, sarebbe fantastico. – coredump
Ed ecco un piccolo tutorial in modo da poter vedere esattamente quello che sono: https://www.codementor.io/python/tutorial/introduction-to-decorators – Sheena