装饰器精读---------大神们多指导

1.  定义

(1)定义一个函数,在运行时动态增加功能

(2)在不改动原先函数代码的情况下,给原先的函数添加额外的功能

2.  格式

@set_fun这个在python语言中叫做语法糖,不是直接的代码,相当于test = set_fun(test)

3.  特点

(1)装饰前的test(原先最早定义的test),由闭包的参数func指向

(2)装饰后的test其实是指向了闭包的内部函数call_fun

(3)道德上,装饰前的代码跟装饰后的代码,调用方式和结果不变

(4)装饰前的test参数,装饰后的test调用参数一致,call_fun函数的参数与我们的装饰前的test参数一致

4.  结构及分析

(1)装饰器 = 闭包 + @函数名

(2)简单的装饰器结构


(3)针对于几中不同类型的函数的不同装饰

无参数,无返回值

无参数,有返回值

注意点:  当没有return时将返回None

有参数,无返回值

注意点:  当test函数有参数,func和call_fun没有传参时代码将会报错,

报错信息如:

不定长参数,无返回值

func时最早定义的test(装饰前),这里一定要进行拆包

不定长参数,有返回值


5.  总结得到万能装饰器

def set_fun(func):
    def call_fun(*args, **kwargs):
        print("添加额外的功能")
        return func(*args, **kwargs)

    return call_fun

@set_fun
def test(*args, **kwargs):
    print(args)
    print(kwargs)
    return 100

value = test(31, 63, a=312263)
print(value)

6.  装饰器与函数之间的关系

(1):  一个装饰器可以装饰多个函数

(2):  一个函数可以使用多个装饰器
判断法则
1.  秋裤大法

先穿后脱,先外后内

2.  电梯法

先上后下,先外后内

3.  深层理解----引用


7.  装饰器传参


注意点:

1.  属于三个函数的嵌套,第三层函数内包含一个闭包,第三层返回闭包最外层的引用,装饰器传参第三层必须有参数

2.  @set_args(参数):

1.  先执行set_args(参数)就是@右边的代码,得到闭包外边的引用(set_fun)
2.  之后执行@返回的闭包引用(@set_fun),相当于@set_fun ====> test = set_fun(test)

3.  test装饰后的还是call_fun

8.  类装饰器

注意点:
1.  使用init方法
2.  使用call方法

3.  @类名  =  test = 类名(test)


猜你喜欢

转载自blog.csdn.net/wpb74521wrf/article/details/80554553