python装饰器
装饰器实际上就是函数,可以在装饰器中置入通用功能的代码来降低程序的复杂度。
功能:
--->引入日志
--->增加计时逻辑来检测性能
--->给函数加入事务的能力
例子1、简单装饰器
1 # -*- coding:utf-8 -*- 2 __author__ = 'webber' 3 4 def decorator(fun): 5 def wrapper(arg): 6 print "你好" 7 fun(arg) 8 print "world!!" 9 return wrapper 10 11 12 #装饰器通过“@”符号把被装饰的函数和装饰函数建立起了连接,在装饰器中,返回的是整个函数wrapper。 13 #在程序执行时,首先执行装饰器函数,把decorator内的wrapper读取到内存中,顺便把Func1函数也读到内存中了,然后在执行正常的顺序调用 14 @decorator #这里,可以把装饰器看成 @decorator = decorator(Func1) 两个函数 15 def Func1(arg): 16 print "装饰器", arg 17 18 Func1("wee") 19 20 ''' 21 这里,相当于 : 22 Func1= 23 def wrapper(): 24 print "你好" 25 fun() 26 print "world!!" 27 '''
例子2、含返回值的装饰器
1 # -*- coding:utf-8 -*- 2 __author__ = 'webber' 3 4 def decorator(fun): 5 def wrapper(arg): 6 print "你好" 7 result = fun(arg) 8 print "world!!" 9 return result 10 return wrapper #这两个return要搞清楚,上一个return返回的是函数执行过程后的返回值,而后一个返回的是整个装饰器加函数的结果 11 12 @decorator 13 def Func1(arg): 14 print "装饰器", arg 15 return "--------> return " 16 17 response = Func1("wee") 18 print response
例子3、复杂装饰器
1 # -*- coding:utf-8 -*- 2 __author__ = 'webber' 3 4 def Filter(before_func, after_func): 5 def outer(main_func): 6 def wrapper(request, kargs): 7 8 before_result = before_func(request, kargs) 9 if (before_result != None): 10 return before_result 11 12 main_result = main_func(request, kargs) 13 if (main_result != None): 14 return main_result 15 16 after_result = after_func(request, kargs) 17 if (after_result != None): 18 return after_result 19 20 return wrapper 21 return outer 22 23 class AccountFilter(object): 24 def __init__(self): 25 pass 26 def Before(self, request, kargs): 27 pass 28 def After(self, request, kargs): 29 pass 30 31 @Filter(AccountFilter.Before, AccountFilter.After) 32 def List(request, kargs): 33 pass
这里是含参数的装饰器,在装饰器中调用before方法和after方法,完成对List方法装饰之前的功能步骤和装饰之后的功能步骤,相当于上面两个例子中的装饰器中的fun()函数上面和下面的两个print的功能。
例子4、python核心编程中的例子,给一个函数通用的加了计时逻辑
1 #-*-coding:utf-8-*- 2 import time 3 4 def time_fun(func): 5 def wrapper(): 6 print '[%s] %s called' % (time.ctime(), func.__name__) 7 func() 8 #return func 9 return wrapper 10 11 @time_fun 12 def foo(): 13 print "I am doing my own work!!!" 14 15 foo() 16 time.sleep(4) 17 18 for i in range(2): 19 time.sleep(1) 20 foo()
输出如下:
[Sat Oct 08 10:24:46 2016] foo called
I am doing my own work!!!
[Sat Oct 08 10:24:51 2016] foo called
I am doing my own work!!!
[Sat Oct 08 10:24:52 2016] foo called
I am doing my own work!!!
可通过时间判定函数被调用的情况。
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构