Декораторы позволяют вносить простые изменения в вызываемые объекты, такие как функции , методы или классы . В этом уроке мы разберемся с функциями. Синтаксис
Как вы могли заметить, декоратор - это просто еще одна функция, которая принимает функцию и возвращает ее. Например, вы могли бы сделать это:
def repeater(old_function):
def new_function(*args, **kwds): # See learnpython.org/en/Multiple%20Function%20Arguments for how *args and **kwds works
old_function(*args, **kwds) # we run the old function
old_function(*args, **kwds) # we do it twice
return new_function # we have to return the new_function, or it wouldn't reassign it to the value
def double_Ii(old_function):
def new_function(arg): # only works if the old function has one argument
return old_function(arg * 2) # modify the argument passed
return new_function
def check(old_function):
def new_function(arg):
if arg < 0: raise (ValueError, "Negative Argument") # This causes an error, which is better than it doing the wrong thing
old_function(arg)
return new_function
Допустим, вы хотите умножить результат на переменную величину. Вы можете определить декоратор и использовать его следующим образом:
def multiply(multiplier):
def multiply_generator(old_function):
def new_function(*args, **kwds):
return multiplier * old_function(*args, **kwds)
return new_function
return multiply_generator # it returns the new generator
# Usage
@multiply(3) # multiply is not a generator, but multiply(3) is
def return_num(num):
return num
# Now return_num is decorated and reassigned into itself
return_num(5) # should return 15
Вы можете делать все, что захотите, со старой функцией, даже полностью игнорируя ее! Продвинутые декораторы также могут управлять строкой документа и номером аргумента. Для некоторых шикарных декораторов перейдите на http://wiki.python.org/moin/PythonDecoratorLibrary .
Упражнение
Создайте фабрику декораторов, которая возвращает декоратор, украшающий функции одним аргументом. Фабрика должна принимать один аргумент, тип, а затем возвращать декоратор, который заставляет функцию проверять, является ли ввод правильным типом. Если это неверно, он должен напечатать («Плохой тип») (на самом деле это должно вызвать ошибку, но в этом руководстве нет сообщения об ошибке). Посмотрите на учебный код и ожидаемый результат, чтобы увидеть, что это такое, если вы запутались (я знаю, что буду). Использование isinstance (object, type_of_object) или type (object) может помочь.