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