📜  Python中的函数装饰器 |第 1 套(介绍)

📅  最后修改于: 2022-05-13 01:54:42.383000             🧑  作者: Mango

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("GeeksforGeeks"))

输出:

Welcome to GeeksforGeeks

函数装饰器

装饰器是一个函数,它接受一个函数作为它的唯一参数并返回一个函数。这有助于一遍又一遍地用相同的代码“包装”功能。例如,上面的代码可以重写如下。

我们使用@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("GeeksforGeeks") as parameter
print site("GeeksforGeeks")

输出:

Welcome to GeeksforGeeks

装饰器还可用于将数据(或添加属性)附加到函数。

# 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'函数,其属性'data'设置为3,因此打印它。

Python装饰器是消除冗余的强大工具。

有关详细信息,请参阅Python中的装饰器。