python基础__装饰器(修饰器)

装饰器处理逻辑

当解释器读到@装饰符,会先解析@下一行的内容,把下一行的函数或者类作为@后边的函数的参数,执行被装饰的函数。

例子1:被修饰函数不带参数

复制代码
 1 def log(func):
 2     def wrapper():
 3         print('log开始 ...')
 4         func()
 5         print('log结束 ...')
 6     return wrapper
 7 
 8 @log
 9 def test():
10     print('test ..')
11 
12 test()
复制代码

例子2:被修饰函数带参数

复制代码
 1 from functools import wraps
 2 def log(func):
 3     @wraps(func)
 4     def wrapper(*args,**kwargs):
 5         print('log开始 ...',func.__name__)
 6         ret = func(*args,**kwargs)
 7         print('log结束 ...')
 8         return ret
 9     return wrapper
10     
11 @log
12 def test1(s):
13     print('test1 ..', s)
14     return s
15 
16 @log
17 def test2(s1, s2):
18     print('test2 ..', s1, s2)
19     return s1 + s2
20 
21 test1('a')
22 test2('a','bc')
复制代码

例子3:修饰符带参数,需要比上面例子多一层包装

复制代码
 1 from functools import wraps
 2 
 3 def log(arg):    
 4     def _log(func):
 5         @wraps(func)
 6         def wrapper(*args,**kwargs):
 7             print('log开始 ...',func.__name__, arg)            
 8             ret = func(*args,**kwargs)
 9             print('log结束 ...')
10             return ret
11         return wrapper
12     return _log
13  
14 @log('module1')
15 def test1(s):
16     print('test1 ..', s)
17     return s
18 
19 @log('module1')
20 def test2(s1, s2):
21     print('test2 ..', s1, s2)
22     return s1 + s2
23 
24 
25 test1('a')
26 test2('a','bc')
复制代码

 

在函数定义中我们返回函数,为什么是函数名,而不是函数名()?

这是因为当把一对小括号放在后面,这个函数就会执行;如果不放括号在函数后面,那函数可以被到处传递,并且可以赋值给别的变量而不去执行它

 

 

 

中国人的人生意义如果用一个具体的词来形容,那就是“牵挂”!当你离开这个世界的时候,心中满是自己牵挂的人和事,如果一个人了无牵挂,那这个人也是不惧怕死亡的。

 

posted @   心如__止水  阅读(235)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示