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)修改指向