Python 装饰器(无参,有参、多重))

Python装饰器介绍

  1. 在Python中,装饰器(decorator)是在闭包的基础上发展起来的。
  2. 装饰器的实质是一个高阶函数,其参数是要装饰的函数名,其返回值是完成装饰的函数名,其作用是为已经存在的函数对象添加额外的功能,其特点是不需要对原有函数做任何代码上的变动。
  3. 装饰器在本质上也是一个嵌套函数,其外层函数的返回值是一个新的函数对象引用,所不同的是,其外层函数可以接受一个现有函数对象引用作为参数。
  4. 装饰器可以用于包装现有函数,即在不修改任何代码的前提下为现有函数增加额外功能。
  5. 装饰器通常应用于有切面(面向切面编程是指运行时动态实现程序维护的一种技术)需求的场景,例如插入日志、性能测试、事务处理、缓存以及权限校验等。
  6. 装饰器是解决这类问题的绝佳设计,有了装饰器,就可以抽离出大量与函数功能本身无关的雷同代码并继续重用它们。

定义装饰器时通常会涉及以下3个函数。

1)装饰器函数:它在函数嵌套关系中作为外层函数出现,其函数体内容包括定义一个内层函数以完成装饰功能的函数,通过return语句向调用者返回内层函数对象引用。
2)目标函数:即需要进行装饰的函数,它作为装饰器函数的形参出现,该函数的定义则出现在调用装饰器的地方。
3)完成装饰的函数:它在函数嵌套关系中作为内层函数出现,用于为待装饰的目标函数添加额外功能。在这个内层函数中要调用目标函数,并为目标函数添加一些新的功能

无参装饰器

def 装饰器名称(待装饰器函数名称):
    def 装饰器函数名称():
        # 目标函数执行前 添加额外功能
        # 目标函数调用 待装饰器函数执行
        # 目标函数执行后 添加额外功能
    return 装饰器函数名称

def decorator(func):
    def inner(*args, **kwargs):
        # func是被装饰的对象,这里可以写执行前的功能
        res = func(*args, **kwargs)
        # func是被装饰的对象,这里可以写执行后的功能
    return inner

# 使用装饰器

@装饰器名称
def 需装饰函数名称():
    pass

有参装饰器

  1. 无参数装饰器本质就是一个双层结构的高阶函数,有参数装饰器则是一个3层结构的高阶函数。

def 装饰器名称(参数1, 参数2,...):
    def 中间层装饰器函数名称(待装饰器函数名称)
        def 里层装饰器函数名称():
            # 目标函数执行前 添加额外功能
            # 目标函数调用 待装饰器函数执行
            # 目标函数执行后 添加额外功能
        return 装饰器函数名称
    return 中间层装饰器函数名称

def decorator(arg1, arg2):
    def middle(func):
        def inner(*args, **kwargs):
            # func是被装饰的对象,这里可以写执行前的功能 可使用参数 arg1, arg2
            res = func(*args, **kwargs)
            # func是被装饰的对象,这里可以写执行后的功能 可使用参数 arg1, arg2
        return inner
    return middle

# 使用装饰器

@装饰器名称(arg1, arg2)
def 需装饰函数名称():
    pass

多重装饰器

  1. 多重装饰器是指使用多个装饰器来修改同一个函数。此时要注意多重装饰器的执行顺序是后面的装饰器先执行,前面的装饰器后执行,即后来者居上。

def first(func):
    def inner(*args, **kwargs):
        print("函数:first执行...")
        func(*args, **kwargs)
        print("函数:first完成")
    return inner

def second(func):
    def inner(*args, **kwargs):
        print("函数:second执行...")
        func(*args, **kwargs)
        print("函数:second完成")
    return inner

# 两装饰器应用于同一函数

@first
@second
def test():
    print("函数:test执行")

# 执行结果
"""
函数:first执行...
函数:second执行...
函数:test执行
函数:second完成
函数:first完成
"""

猜你喜欢

转载自www.cnblogs.com/deja-ve/p/12504539.html