python装饰器详解
https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584
在上述网站中出现了一道习题
请编写一个decorator,能在函数调用的前后打印出
'begin call'
和'end call'
的日志。再思考一下能否写出一个
@log
的decorator,使它既支持:
@log def f(): pass
又支持:
@log('execute') def f(): pass
为了解答这道题目,首先需要明确python装饰器的含义,含义只有一句话:
把@log
放到now()
函数的定义处,相当于执行了语句:now = log(now)
解答代码如下:
import functools
def now():
print('2015-3-25')
def log(text):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
if isinstance(text, str):
print('%s %s():' % (text, func.__name__))
else:
print('%s():' % func.__name__)
print('begin call')
result = func(*args, **kw)
print('end call')
return result
return wrapper
# 下面几行是关键,如果没有传入str,那么就要返回decorator(text)
if isinstance(text, str):
return decorator
else:
# 为什么要在decorator加上text,没有搞懂
return decorator(text)
@log
def f():
pass
@log('HAHAHA')
def f2():
pass
t1 = f()
t2 = f2()
参考网站:https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584
分类:
python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)