最详细的装饰器非常详细的详解。。。备忘录

装饰器是将一个函数镶嵌在另一个函数中进行重复使用的目的,增加函数的使用方式,但是不用写过多冗余的代码:
1.最简单的装饰器
def a(func):
	print(1)
	def b():
		print(2)
		func()
		print(3)
	return b
@a
def c():
	print(4)
c()
当程序运行时:先执行@a,得到一个1和函数的对象b,b和b()是不一样的
b只是一个对象,并不会运行,然后当运行到c()的时候,相当于给了b执行的

参数,然后我们会执行2,func()得到4,3,到这里程序结束

运行结果:


2.当加入参数的装饰器,是这样的:

def a(func):
	print(1)
	def b(*args,**kwargs):
		print(2)
		func(*args,**kwargs)
		print(3)
	return b
@a
def c(a,b):
	print(a+b)
c(3,4)
#args 将参数打包为tuple给函数使用(3,4)
#kwargs将参数打包为dict给函数使用,将传入的a=1这样的参数变为{'a':1}
我们这里相当于 a(c(a,b))这个函数

所有这里的b()其实就相当于c()

运行结果:


3.当使用多个参数的装饰器时:

def a(func):
    print('i\'m a!')
    def e():
        print(1)
        func()
        print(2)
    return e
def b(func):
    print('i\'m b!')
    def d():
        print('a')
        func()
        print('b')
    return d

@a
@b
def c():
    print('!!!!!')
c()
想了很久,首先有两个装饰器的时候,会自下而上的运行,砸门会得到两个
对象d,e,这里从输出可以看出
当我们赋予c参数时,运行d,e,运行的时候是从上往下的
我们先运行e()函数,输出1,运行到func()的时候会停下
跳转到同样的d()函数开始运行,输出a,运行到func()会执行c()函数

最后输出b,在输出2

结果:


经过我不断注释掉d和e里面的func,经过深思之后得到:

  def e():
        print(1)
        def d():
print('a')
c()
print('b')
return d
        print(2)

第一层得到 d()
第二层得到 e()对d()进行装饰
哇擦擦!我真聪明。。。这装饰器真能装啊,差点就晕了
懂没懂!清不清楚!瞬间想通,多个装饰器不就是这个装饰器对上一个装饰器的装饰嘛
  • 16
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值