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

posted on   coderabcd  阅读(95)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示