装饰器(重点,难点)
开闭原则:
对功能的扩展开放
对代码的修改是封闭的
在目标函数前和后插入一段新的代码.不改变原来的代码
通用装饰器写法:
# 存在的意义: 在不破坏原有函数调用的基础上,给韩式添加新的功能
def wrapper(fn): # fn是目标函数
def inner(*args, **kwargs): # 聚合, 为了目标函数的传参
\'\'\'\'在目标函数之前....\'\'\'\'
ret = fn(*arg, **kwargs) # 打散, 调用目标函数,ret是目标韩式的返回值
\'\'\'\'在目标函数之后....\'\'\'
return ret #把目标函数返回值返回.保证函数正常的结束
return inner
@wrapper ### func = wrapper(func) == @wrapper
def func():
pass
#### func = wrapper(func) #此时fn就是func
func() #此时执行的是inner
举例造人
def wrapper(fn):
def inner():
print(\'浇水\')
fn()
print(\'睡一觉\')
return inner
def zaoren():
print(\'捏个泥人\')
print(\'吹口仙气\')
print(\'你就出来了\')
zaoren = wrapper(zaoren)
zaoren()
同一个函数被多个装饰器装饰
@wrapper1
@wrapper2
@wrapper3
def func():
pass
1 2 3 func 3 2 1
def wrapper1(fn):
def inner(*args, **kwargs):
print(\"1111111\")
ret = fn(*args, **kwargs)
print(\"2222222\")
return ret
return inner
def wrapper2(fn):
def inner(*args, **kwargs):
print(\"3333333\")
ret = fn(*args, **kwargs)
print(\"44444444\")
return ret
return inner
def wrapper3(fn):
def inner(*args, **kwargs):
print(\"555555\")
ret = fn(*args, **kwargs)
print(\"666666\")
return ret
return inner
# 就近原则
@wrapper1
@wrapper2
@wrapper3
def func():
print(\"我是可怜的func\")
func()
# 1 2 3 func 3 2 1
##1111111
3333333
555555
我是可怜的func
666666
44444444
2222222
带参数的装饰器(难受)
def wrapper_out(参数):
def wrapper(fn):
def inner(*args, **kwargs): # 聚合
在目标函数之前
ret = fn(*arg, **kwargs) # 打散
在目标函数之后
return ret
return inner
return wrapper
@wrapper_out(实参) # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
def func():
pass
eval => 文件操作
装饰器
函数
开始举例
def wrapper(fn):
def inner(*args, **kwargs):
print(\'问问金老板,行情怎么样啊\')
ret = fn(*args, **kwargs)
print(\'金老板骗我,恨你\')
return ret
return inner
def yue():
print(\'走啊,约不?\')
yue = wrapper(yue)
yue()
进行判断
def wrapper_out(flag): # 装饰器本身的参数
def wrapper(fn): # 目标函数
def inner(*args, **kwargs): # 目标函数执行需要的参数
if flag == True:
print(\"问问金老板. 行情怎么样啊\")
ret = fn(*args, **kwargs) # 在执行目标函数之前
print(\"金老板骗我. 恨你\")
return ret
else:
ret = fn(*args, **kwargs) # 在执行目标函数之前
return ret
return inner
return wrapper
# 语法糖 @装饰器
@wrapper_out(True) # 先执行wrapper_out(True) 返回一个装饰器 再和@拼接 @装饰器
def yue(): # 被 wrapper装饰
print(\"走啊. 约不?\")
yue()
继续阅读与本文标签相同的文章
上一篇 :
九大网页编程入门网站
-
Serverless Kubernetes全面升级2.0架构:支持多命名空间、RBAC、CRD、PV/PVC等功能
2026-05-19栏目: 教程
-
6个常见的高并发缓存问题,你知道几个?
2026-05-19栏目: 教程
-
再有人问你ThreadLocal,就把这篇文章扔给他
2026-05-19栏目: 教程
-
RocketMQ消费失败消息深入分析(consumer,broker的具体处理逻辑)
2026-05-19栏目: 教程
-
RocketMQ消费失败重试机制分析
2026-05-19栏目: 教程
