You are currently viewing Декораторы функций в Python | Набор 1 (Введение)

Декораторы функций в Python | Набор 1 (Введение)

Фон

Ниже приведены важные факты о функциях в Python, которые полезны для понимания функций декоратора.

  1. В Python мы можем определить функцию внутри другой функции.
  2. В 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 — это мощный инструмент для устранения избыточности.