我们循序渐进来理解
第一步:理解下面的代码。函数作为参数传递,增强原函数功能
def yuan():
print("2")
def xin(func):
print("1")
func()
print("3")
if __name__ == '__main__':
xin(yuan)
#缺点就是这里可读性不好,期望是可以直接调用yuan()就可以,调用时无感知就能多输出1和3,增强了原来只能输出个2
第二步:解决上一个缺点
def yuan():
print("2")
def xin(func):#声明参数是一个函数,这里是的函数名是地址,可以调试查看一下是不是地址
#挖个坑:如果在这里加一行代码,会不会先执行这一行
def case():
print("1")
func()#传进来的地址加了括号就会执行该方法
print("3")
return case #把上面的case方法返回出去,上面只是声明了一个方法和方法体,没执行
# 为什么一定要return,因为传进来一个函数,我们增强后要再返回(有借有还,改装好还给人家)。
# 我们在main里调用的实际是这个case函数
if __name__ == '__main__':
yuan=xin(yuan) #装饰器就是把这行省略了,前面的坑就是比装饰器先执行;传进去的yuan不带括号就是个函数的地址
#-------------------
yuan() #这里就解决了第一步的缺点可读性,直接调用yuan()就增强了,但是前面还是多了一行;xin里面返回了case的地址,给了yuan,此时yuan价格括号就可以执行了
再来理解这个概念
1、闭包函数:增强原函数,其参数和返回值都是函数
将原函数作参数传入新函数,在原函数基础上增加功能后,再把新函数赋值给原函数
def a():
print("1")
def b(func):
def c():
print("0")
func()
print("2")
return c #自己不能返回自己,所以要多加一层函数c,b函数返回c
if __name__ == '__main__':
a=b(a)
a()
输出就是012
装饰器:会把原函数a当做参数,传入增强函数装饰器b中,装饰器内增加内容后再返回,顶替之前的a函数
优化闭包
def b(func):
def c():
print("0")
func()
print("2")
return c #自己不能返回自己,所以要多加一层函数c,b函数返回c。把增强后的函数还给人家
@b
def a():
print("1")
if __name__ == '__main__':
a()#这里终于实现了单独写个a()方法就能增强,多输出0和2
输出就是012
多重装饰器
def b2(func):
print("ss2")
def c():
print("0")
func()
print("2")
return c #自己不能返回自己,所以要多加一层函数c,b函数返回c。把增强后的函数还给人家
def b1(func):
print("ss1")
def c():
print("0")
func()
print("2")
return c #自己不能返回自己,所以要多加一层函数c,b函数返回c。把增强后的函数还给人家
@b1
@b2
def a():
print("1")
if __name__ == '__main__':
a()
求输入结果
简化多层装饰器为闭包函数,方便理解
简化闭包函数方便理解
已标明执行顺序重点在11步到12步
B站讲的最好的装饰器知识,看完还是不懂,可以再看一下视频
https://www.bilibili.com/video/BV1SZ4y1s7cv?spm_id_from=333.1007.top_right_bar_window_custom_collection.content.click