浅谈python中的装饰器
- 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.****.net/kun1280437633/article/details/79520261
1、要想了解装饰器,首先要知道什么是闭包?
内部函数调用外部函数的变量 (闭包是完成一段功能时需要一个保持一个数据)
一个闭包就是你调用了一个函数A,这个函数A返回了一个函数B给你。这个返回的函数B就叫做闭包。
闭包的写法 (两层函数的嵌套,外部函数返回内部函数的引用,外层函数都带参数)
def 外层函数的名称(参数):
def 内层函数的名称():
pass
return 内层函数的引用
2、装饰器(用来装饰函数,在不改变函数的情况下去做一些功能)的写法
(1)先写闭包
(2)在要装饰的函数上@闭包的外部函数名
例子:
def set_fun(func):
def call_fun():
print("执行前")
func() # func指向是装饰前的函数
print("执行后")
return call_fun
# @名称就叫装饰器@set_fun # test = set_fun(test)
def test():
print("test")
test() # 总结: 装饰前的函数由func指向 ,装饰后的函数由闭包的内部函数引用了(call_fun)
3、万能装饰器的写法(装饰的函数有无参数,有无返回值)及原理图解
def set_fun(func):
def call_fun(*args,**kwargs):
return func(*args,**kwargs)
return call_fun
4、多个装饰器装饰一个函数的写法及其图解(口诀:先进后出,先外后内)
def set_fun1(func):
print("set_fun1")
def call_fun(*args,**kwargs):
print("call_fun1")
return func(*args,**kwargs)
return call_fun
def set_fun2(func):print("set_fun2")
def call_fun(*args,**kwargs):
print("call_fun2")
return func(*args,**kwargs)
return call_fun
@set_fun2 # test = set_fun2(test)@set_fun1 # test = set_fun(test)
def test():
print("test")
test()
4、装饰器中传入参数
def set_args(data):
print(data)
def set_fun(func):
print("222")
def call_fun(*args, **kwargs):
print("333")
return func(*args, **kwargs)
return call_fun
return set_fun
@set_args(444) #第一步set_args("num")执行,他的返回肯定是装饰器的引用(set_fun),第二步@set_fun就跟上面是一样的
def test():
print("555")
test()
# 结果:444 222 333 555