彻底掌握python装饰器一(python闭包函数及装饰器(原理性初步理解))

我们循序渐进来理解
第一步:理解下面的代码。函数作为参数传递,增强原函数功能

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值