Фон
Ниже приведены важные факты о функциях в Python, которые полезны для понимания функций декоратора.
- В Python мы можем определить функцию внутри другой функции.
- В Python функция может быть передана в качестве параметра другой функции (функция также может возвращать другую функцию).
# A Python program to demonstrate that a function
# can be defined inside another function and a
# function can be passed as parameter.
# Adds a welcome message to the string
def messageWithWelcome(str):
# Nested function
def addWelcome():
return "Welcome to "
# Return concatenation of addWelcome()
# and str.
return addWelcome() + str
# To get site name to which welcome is added
def site(site_name):
return site_name
print messageWithWelcome(site("ProgramBox"))
Выход:
Welcome to ProgramBox
Декоратор функций
Декоратор-это функция, которая принимает функцию в качестве единственного параметра и возвращает функцию. Это полезно для “обертывания” функциональности одним и тем же кодом снова и снова. Например, приведенный выше код можно переписать следующим образом.
Мы используем @func_name, чтобы указать декоратора, который будет применяться к другой функции.
# Adds a welcome message to the string
# returned by fun(). Takes fun() as
# parameter and returns welcome().
def decorate_message(fun):
# Nested function
def addWelcome(site_name):
return "Welcome to " + fun(site_name)
# Decorator returns a function
return addWelcome
@decorate_message
def site(site_name):
return site_name;
# Driver code
# This call is equivalent to call to
# decorate_message() with function
# site("ProgramBox") as parameter
print site("ProgramBox")
Выход:
Welcome to ProgramBox
Декораторы также могут быть полезны для прикрепления данных (или добавления атрибута) к функциям.
# A Python example to demonstrate that
# decorators can be useful attach data
# A decorator function to attach
# data to func
def attach_data(func):
func.data = 3
return func
@attach_data
def add (x, y):
return x + y
# Driver code
# This call is equivalent to attach_data()
# with add() as parameter
print(add(2, 3))
print(add.data)
Выход:
5
3
‘add()’ возвращает сумму x и y, переданных в качестве аргументов, но она завернута функцией декоратора, вызов add(2, 3) просто даст сумму двух чисел, но когда мы вызываем add.data, затем функция » add «передается в функцию декоратора «attach_data» в качестве аргумента, и эта функция возвращает функцию » add «с атрибутом «данные», который установлен в 3 и, следовательно, печатает его.
Декораторы Python — это мощный инструмент для устранения избыточности.