# 1. 装饰器的原则 -> 开放封闭原则
# 2. 装饰器的作用 -> 在不改变函数调用方式的基础上在函数的前、后添加功能
def wrapper1(func):
def inner1():
print('wrapper1 ,before func')
ret = func()
print('wrapper1 ,after func')
return ret
return inner1
def wrapper2(func):
def inner2():
print('wrapper2 ,before func')
ret = func()
print('wrapper2 ,after func')
return ret
return inner2
@wrapper2
@wrapper1
def f():
print('in f')
return '哈哈哈'
print(f()) # 哈哈哈