python函数-装饰器
python函数-装饰器#
1.装饰器的原则--开放封闭原则#
开放:对于添加新功能是开放的
封闭:对于修改原功能是封闭的
2.装饰器的作用#
在不更改原函数调用方式的前提下对原函数添加新功能
3.装饰器的本质--闭包#
4.装饰器#
(1)简单的装饰器
def deco(f): def wrapper(): """原函数前添加的功能""" f() """原函数后添加的功能""" return wrapper def func(): print('这是原函数!') func = deco(func) func()
(2)装饰器的语法糖-----@deco
def deco(f): def wrapper(): """原函数前添加的功能""" f() """原函数后添加的功能""" return wrapper @deco # ——>此处效果等同于 func = deco(func) def func(): print('这是原函数') func()
(3)带返回值的装饰器
def deco(f): def wrapper(): """原函数前添加的功能""" res = f() """原函数后添加的功能""" return res return wrapper @deco def func(): print('这是原函数') func()
(4)装饰器加参数的固定格式
def deco(f): def wrapper(*args,**kwargs): """原函数前添加的功能""" res = f(*args,**kwargs) """原函数后添加的功能""" return res return wrapper @deco def func(*args,**kwargs): print('这是原函数') func()
(5)装饰器的固定格式--wraps版
from functools import wraps def wrapper(func): @wraps(func) def inner(*args,**kwargs): print('在被装饰的函数执行之前做的事') ret = func(*args,**kwargs) print('在被装饰的函数执行之后做的事') return ret return inner @wrapper def holiday(day): print("新年快乐") return '好开心' print(holiday.__name__) print(holiday.__doc__) ret = holiday(3) print(ret) >>>> holiday None 在被装饰的函数执行之前做的事 新年快乐 在被装饰的函数执行之后做的事 好开心
(6)多个装饰器装饰一个函数
def wrapper1(func): def inner1(): print('wrapper1 ,before func') func() print('wrapper1 ,after func') return inner1 def wrapper2(func): def inner2(): print('wrapper2 ,before func') func() print('wrapper2 ,after func') return inner2 @wrapper2 # 将inner1进行装饰,即inner1 = wrapper2(inner1) = inner2 @wrapper1 # 先执行这个装饰器,即f = wrapper1(f) = inner1 def f(): print('in f') f() >>>> wrapper2 ,before func wrapper1 ,before func in f wrapper1 ,after func wrapper2 ,after func
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现