目录:
创作不易,各位看官,点个赞收藏、关注必回关、QAQ、您的点赞是我更新的最大动力!![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1587914209312&di=7c08ec8c9b731251936ef1634c2c3108&imgtype=0&src=http%3A%2F%2Fimg.tukexw.com%2Fimg%2F88577cec0bf3b4c2.jpg)
一、装饰器详解
1.我们来看这是常规的函数执行方式、不带参数的,启动函数func()
2.这是需要参数的函数,启动的时候需要送个参数 outter(2)不一定是2可以是任意
3.下一步我们改造一下这个outter()函数,嵌套一个inner()函数。可以发现
程序只打印了一条数据“-- outter --” ,总所周知,程序正常都是自动向下运行
从25启动开始→20→跳过inner()函数→24.可能存在疑问,为什么跳过inner()执行?参考1
4.那么如何启动inner()函数了呢?只需这样再这样,这样这样QAQ…
从28行起 outter(2) 启动函数→20→跳过(21,22,23,24)为啥跳过参考1→25 打印 → 26 返回值 [outter(f) = inner]
→回到28 使得inner = inner→29 inner+() 字符拼接一样 组成了inner() 不就启动了吗?
→然后跳到22 23 执行打印 。就得到了如图结果,你品,你细细品?这品不会面壁思过
5.下一步将func()函数和outter()函数一起运用
32启动 通过outter(func)将func字符送入到outter函数→20 f 接受到32 得f = func
→跳过(21,22,23,24,25) 26 打印→27 返回inner字符到20 使得outter(f)= inner字符 →
32 outter(func) 即 outter(f) =inner 字符 inner =inner→→33 inner+()字符 便启动了
6、再调整下。。。。装饰器最终完成
注意!!!!!!
1、@outter 为装饰函数 也就是参考上面5 . 第32行 演化而来,使用的时候放到需要调用的函数前面 参考下面 29行
2、对照上面5 第32 33行 和 下面 第33行 发现inner () 为啥改名字?
因为以上讲解方法实则为了理解!!!!!!!!!
真实情况应该修改成你需要装饰函数名称 也就是第33行
你可以不修改使用inner() 试试 会报错
二、装饰器进阶
1、万能参数装饰器
基本格式:
def outter(f):
def inner(*args,**kwargs):
print(args) # --> ()
print(kwargs) # -->{}
return inner
@outter
def func():
print("这是fucn函数")
func()
运用:
def outter(f):
def inner(*args,**kwargs):
print(args) # -->(10,20)
print(kwargs) # -->{'name': '稳稳c9'}
f() # -->这是func函数
return inner
@outter #func = outter(func) func = inner
def func():
print("这是fucn函数")
func(10,20,name="稳稳c9")
2、带参数的装饰器
def outter(f):
def inner(a,b):
f(a,b)
return inner
@outter
def func(a,b):
print(a+b)
print(f"这是fucn函数")
func(3,5)
3、带返回值的装饰器
def outter(f):
def inner():
f()
return inner
@outter
def func():
print(f"这是fucn函数")
return "hello world"
func()
4、多个装饰器
# 多个装饰器的装饰过程
# 执行原理:先执行距离函数近的装饰器
def outter1(f):
def inner1():
print("--- berfore inner1 ---")
f()
print("--- after inner1 ---")
return inner1
def outter2(f):
def inner2():
print("--- berfore inner2 ---")
f()
print("--- after inner2 ---")
return inner2
@outter1 # func = outter1(func)
@outter2 # func = outter2(func)
def func():
print("---in func ---")
func()