python 装饰器 & 可同时接受有参数与无参数的装饰器

版权声明:本文为博主原创文章,转载请附上出处。 https://blog.csdn.net/k_runtu/article/details/83021704

昨天下午仔细学习了装饰器的内容,算是比较明白了。标题的题目来源于这里

from functools import wraps
def log(ft):
    if not isinstance(ft, str):
        @wraps(ft)
        def wrapper(*args, **kwargs):
            print('wrapper')
            return ft(*args, **kwargs)
        return wrapper
    else:
        def decorator(func):
            @wraps(func)
            def wrapper(*args, **kwargs):
                print('wrapper and text:{}'.format(ft))
                return func(*args, **kwargs)
            return wrapper
        return decorator
 
 # 测试结果:
In [2]: @log
   ...: def test():
   ...:     print('test')
   ...:

In [3]: test()
wrapper
test

In [4]: @log('execute')
   ...: def test():
   ...:     print('test')
   ...:

In [5]: test()
wrapper and text:execute
test

装饰器: 装饰器本身是一个函数,然后接受另外一个函数作为参数,在返回被装饰函数的执行结果的前后可以做些事情。比如:

from functools import wraps
def log(func):
    @wraps(func)# wraps 的作用是处理装饰之后函数的__name__属性的改变
    def wrapper(*args, **kwargs):
        print('wrapper')  # 在被装饰函数执行之前打印一些信息
        return func(*args, **kwargs) # 原样返回原函数的返回值,参数不变
    return wrapper

# 当装饰发生的时候,相当于 test = log(test)
# 如果装饰器本身需要接受参数的话, 相当于 test = log(args)(test), 所以在log这个装饰器内部需要返回一个类似不接受参数的装饰器,然后这个不需要接受参数的装饰器可以使用外部的参数,相当于闭包。

def log(text):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print('wrapper and text:{}'.format(text)) # 可以使用text变量,相当于闭包
            return func(*args, **kwargs)
        return wrapper
    return decorator    # 返回一个相当于上面的不需要接受参数的装饰器(func参数是自动加上去的,为被装饰函数)

猜你喜欢

转载自blog.csdn.net/k_runtu/article/details/83021704
今日推荐