python装饰器

import functools


# 在代码运行期间动态增加功能的方式,称之为“装饰器”,装饰器就是返回函数的高阶函数

# 不带参数的装饰器
def log1(func):
    # 修正装饰器的name指向
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print(func.__name__, '我要插入一个日志')
        return func(*args, **kw)
    return wrapper

# 带参数的装饰器 中间再加一层函数包裹
def log2(str):
    def d(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (str, func.__name__))
            return func(*args, **kw)
        return wrapper
    return d

def log3(str):
    def d(func):
        # @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (str, func.__name__))
            return func(*args, **kw)
        return wrapper
    return d

# 相当于 log1(hello1)
@log1
def hello1():
    print('hello world1')

# 相当于log2(111)(hello2)
@log2('111')
def hello2():
    print('hello world2')

@log3('222')
def hello3():
    print('hello world3')

hello1() # 装饰器打印hello1 我要插入一个日志  函数本身打印hello world1

print(hello1.__name__)
print(hello2.__name__) # hello2
print(hello3.__name__) # wrapper 因为没有 @functools.wraps(func)修改指向

  

原文地址:https://www.cnblogs.com/leyi/p/11672774.html