python 装饰器

今日大雨,访友,故不能将所需之物记录纸张之上,就让csdn记录下今日学习的理解,以待后用

装饰器:顾名思义就是修饰装饰的意思,python中的装饰器是对函数的一种修饰或验证等操作

即在调用函数前后或者返回值做相应的一些逻辑处理。
1).引入装饰器;
对写好的一些框架函数如果在版本的迭代中需要对定义好的函数进行一些附加的逻辑操作,此时如果直接修改框架函数会带来诸多麻烦,
装饰器此时可以出场了 ^_^
eg: 
需求:需要在fn函数调用前输出一个字符串等逻辑
 def modify(fun):
def inner_mo():
print('---inner_mo was invoked----')
fun()
return inner_mo

def fn():
print('fn was invoked')

ret = modify(fn)
ret()#就能达到效果
以上的缺点之处在于如果fn函数已经被调用了,并且不能修改其调用方式,也就是说使用** fn() **的方式进行调用已经确定了,不能再修改
即使能修改如果fn函数在很多地方调用了若修改会有很多处code需要修改、此时真正的装饰器就登场:
在fn的定义前一行是用 ** @modify **来修饰要被修饰的函数就可以达到效果
以上只是引出了装饰器使用的一个场景,当然装饰器使用场景还有很多。


2)下边对装饰器的知识点进行记录:
1.被修饰的函数含有参数(a,b)
coding:
@modify
def fn(a,b):
print(a,b)

def modify(fun):
def inner_mo(a,b):
fun(a,b)
return inner_mo

使用:fn(1,2)
2.被修饰的函数含有不定参数(args,kwargs)
coding:
@modify
def fn(*args,**kwargs):
print(*args,**kwargs)

def modify(fun):
def inner_mo(*args,**kwargs):
fun(*args,**kwargs)
return inner_mo

使用:fn(123,34,354,'hello')
3.被修饰的函数有返回值
coding:
@modify
def fn():
print()

def modify(fun):
def inner_mo():
ret = fun()# **获取返回值
print(ret) #** 对返回值做相应的处理
return ret
return inner_mo

使用:ret = fn()
4.含有参数的装饰器:同一个装饰器传递的参数不一样会有不同的处理方式
coding:
@modify('lisy')
def fn(a,b):
print(a,b)

def modify_arg(param = 'adb'):
def modify(fun):
print(param)#对装饰器的参数进行应用
def inner_mo(a,b):
fun(a,b)
return inner_mo
return modify
使用:fn()
5.通用装饰器
def modify(fun):
def inner_modify(*args,**kwargs):
ret = fun(*args,**kwargs)
#对ret做相应的逻辑处理,对参数做处理...
return ret
return inner_modify
6.两个或多个装饰器
@modify1
@modify
def fn(a,b):
print(a,b)

def modify(fun):
def inner_mo(a,b):
fun(a,b)
return inner_mo
def modify1(fun):
def inner_mo():
fun()
return inner_mo
modify1将modify看作一个装饰器,先执行下层的装饰器,再执行外层的装饰器
3)使用原理
在1)中ret = modify(fn) ret()这两条语句中若将其改为 fn = modify(fn),fn()也能达到相应的效果,
其实装饰器就是使用的这一原理才得以将函数进行装饰。
比如:
@modify
def fn():
print('fn---')
def modify(fun):
print('modify was invoked')
def inner_mo():
fun()
return inner_mo
在未调用fn函数之前在解释器到达时将会在控制台输出   'modify was invoked' 即在调用fn之前函数装饰器已经对fn进行装饰了
在调用fn()的时候:@modify <==> fn = modify(fn)
    内存中有modify函数对象 还有一个inner_mo函数对象
即此时fn对象指向modify 而modify 返回的是inner_mo 也就是说fn最终指向的是inner_mo函数
如果是两层装饰器调用函数依旧最终指向的是外层的闭包内部的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值