【Python】装饰器_详解

装饰器:

     定义:本质是函数(装饰其他函数),意思就是为其他函数添加附加功能。

    原则:1.不能修改被装饰函数的源代码

          2.不能修改被装饰函数的调用方式

    实现装饰器,要具备的知识:

       1.函数即变量

          2.高阶函数(满足下面一个条件就是高阶函数  )    

          a:把一个函数名当做实参传递给另外一个函数

          b:返回值中包含函数名 (不修改函数的调用方式)                

          3.嵌套函数

              高阶函数+嵌套函数==》装饰器

小虾这就来举一个比较常见的例子:

def  decorator (func):
    def inner():
        # 验证1
        # 验证2
        # 验证3
        return func()
    return inner
 
@decorator  =》f1=decorator(f1)
def f1():
    print ('f1')

注意:@函数名 是python的一种语法糖。   

如上例@decorator,内部会执行一下操作:执行decorator 函数,并将 @decorator 下面的 函数 作为decorator函数的参数,即:@decorator 等价于 decorator(f1)所以,内部就会去执行:

def inner:
        #验证
        return f1()   # func是参数,此时 func 等于 f1
    return inner     # 返回的 inner,inner代表的是函数,非执行函数

# 其实就是将原来的 f1 函数塞进另外一个函数中

将执行完的 decorator 函数返回值

赋值

给@

decorator

下面的函数的函数名

decorator函数的返回值是:

def inner:
   #验证
    return 原来f1()  # 此处的 f1 表示原来的f1函数
然后,将此返回值再重新赋值给 f1,即:新f1 = def inner:
                        #验证
                        return 原来f1() 

所以,以后想要执行 f1 函数时,就会执行 新f1 函数,在 新f1 函数内部先执行验证,再执行原来的f1函数,然后将 原来f1 函数的返回值 。

 上面提到的装饰函数没有参数:那么问题来了,如果其含有参数呢?又该如何呢?

def w1(func):
    def inner(*args,**kwargs):
        # 验证1
        # 验证2
        # 验证3
        return func(*args,**kwargs)
    return inner
 
@w1
def f1():
    print("f1")
def f2(arg1,arg2,arg3):
    print ("f2")

上面代码中通过在装饰器中的参数中使用(*args,**kwarge)(*args是非关键字参数,用于元组,**kw是关键字参数,用于字典),就可以装饰具有处理n个参数的函数的装饰器。(如果有什么不太明白的,可以查看这篇博客  https://blog.csdn.net/qq_33432841/article/details/107768100 

我们什么都没有,唯一的本钱就是青春。梦想让我与众不同,奋斗让我改变命运!
原文地址:https://www.cnblogs.com/mengmengxia/p/13427365.html