От една страна, не е твърде трудно да се съобрази, че това, което се подава на един декоратор, съвсем не е нужно да бъде функция:
def snoop(func):
def snooping(*args, **kwargs):
print("Now look who's {0}ing with {1} and {2}!".format(func.__name__, args, kwargs))
return func(*args, **kwargs)
return snooping
@snoop
def add(x, y): return x + y
@snoop
class hushhush:
def __init__(self, secret):
print("No one knows that we are hush-hushing, right?")
self._secret = secret
def tellmetellmetellme(self):
return self._secret
А като се замислиш, това може да доведе до... забавни ефекти :)
def evil(func):
def returnnone(*args, **kwargs):
print('Ia! Ia! Shub-Niggurath!')
return None
return returnnone
@evil
class victim:
def __init__(self, foo):
print('Initializing a', self.__class__.__name__, 'object with', foo)
self._something = foo
def __call__(self):
return self._something
А кой питаше за това дали един декоратор може да бъде приложен към самия себе си? :)
def muenchhausen(func):
print('Trying to pull', func.__name__, 'out by its hair...')
return func(func)
@muenchhausen
def improve(func):
def improved(*args, **kwargs):
print("Hey now, don't you just love the new and improved {0}!".format(func.__name__))
return func(*args, **kwargs)
print('Improving', func.__name__)
return improved
Но, както си пише и в заглавието на темата, не опитвайте това вкъщи!... а на работа - още по-малко! :P
...а може би е добре да си лягам да спя, преди да ми е хрумнала още някоя простотия...