浅析python中的装饰器decorator
1.Python的命令模式和交互模式2.Python笔记
3.浅析python中的装饰器decorator
4.Python网络编程-Socket简单通信(及python实现远程文件发送)5.python中的*args和**kw6.Python脚本之安装linux源码包-Jenkins7.Python 数据处理库pandas教程(最后附上pandas_datareader使用实例)8.Python 机器学习库 NumPy 教程9.Flask(python)异步(ajax)返回json格式数据10.Python爬虫之urllib-登录博客园11.(转载)python调用shell命令之os 、commands、subprocess12.Head First Python-python面向对象13.Head First Python-Python简单处理文件14.Head First Python-Python中与文件相关的操作-读、处理、写15.Python3实现自动查询成绩(主要使用的包有Tesseract-OCR、PIL、execjs、pytesseract、BeautifulSoup)16.Python数据挖掘之随机森林17.Python 绘图库Matplotlib入门教程最近学习python,其中decorator比较难理解,遂写一篇来总结供后续查阅。
定义一个函数,想在运行时动态的改变函数的功能,又不想改变函数本身的代码,可以使用高阶函数(可以使用函数作为参数)
装饰器函数可以简化代码,避免每个函数编写重复的代码,也可以用在python web开发中进行登录限制。
1,一般的函数调用-硬编码调用,代码中直接调用函数(直接调用原函数):
def func1(): print ("func1") def func2(): print("before") func1() print("after") func2()
输出为:
2,python中可将函数作为参数进行传递(高阶函数):
def func1(): print("func1") def wrapper(func): #装饰器函数 print("before") func() print("after") return func #如果不写return func,函数会自动返回,默认为0 func1=wrapper(func1)
调用结果同上。
wrapper函数最后如果不返回func,再次调用func1,则会包以下错误TypeError: 'NoneType' object is not callable:
3,python中的decorator中可以简化上述调用:
def wrapper(func): print("before") func() print("after") return func @wrapper def func1(): print("func1")
直接执行,结果同上。
4,这种装饰器执行一次调用一次,我们如果希望显示调用,则可以在函数内部封装一层:
def wrapper(func): def inner(): print("before") func() print("after") return inner @wrapper def f(): print("call f") f()#显示调用
5,上面是无参数的装饰器,python中可以实现有参装饰器调用:
def wrapper(func): def inner(a,b): print("before wrapper") func(a,b) print("after wrapper") return inner @wrapper def f(a,b): print ("call f: a+b=%d"% (a+b) ) f(2,3) # f=wrapper(f)=inner
6,有时候,不确定装饰器中参数个数的情况下,就不能使用一般参数、默认参数了,可以使用(*args, **kwargs)来自动适应变参和命名参数:
#coding:utf-8 def wrapper(func): def inner(*args, **kwargs): print("before %s"%func.__name__) result=func(*args,**kwargs) print("result of %s is %d"%(func.__name__,result)) return inner @wrapper def f1(a,b): print("call f1") return a+b @wrapper def f2(a,b,c): print("call f2") return a+b+c f1(1,2) f2(2,3,4)
7,使用functools.wraps在装饰器中包裹传进来的函数,这样就不会丢失传进来的函数的__name__等属性:
from functools import wraps def my_decorator(func): @wraps(func) def wrapper(*args, **kwargs): print('wrapper') func(*args, **kwargs) return wrapper @my_decorator def my_fun(): print('test') #exec my_fun()
8,装饰器在flask中的应用:
#只贴出装饰器核心代码 def login_decorator(func): @wraps(func) def wrapper(*args, **kwargs): if session.get('manage_name'): return func(*args, **kwargs) else: return redirect(url_for('login')) return wrapper @app.route('/post') @login_decorator def post(): if request.method == 'GET': return render_template('post.html') else: pass
具体代码可见我的github
参考:简书
如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨小小打赏一下吧,如果囊中羞涩,不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?