装饰器精读---------大神们多指导
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)