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 2022-05-03 15:59  coderabcd  阅读(87)  评论(0编辑  收藏  举报

导航