无参装饰器
def outter(func): # func:调用方法是传入的index的方法名
# (*args, **kwargs)表示什么值都可以接收,这里接收的是元组 (11, 22, 33)
def wrapper(*args, **kwargs):
print("args>>>>>>>", *args) # args>>>>>>> 11 22
print("kwargs>>>>>>>", *kwargs) # kwargs>>>>>>> z
‘’‘
业务代码
’‘’
# 此处会调用index()方法,
# 加* 会将传入的元组(11, 22, 33)重新打散成 11 22 33
# 此处相当于 index(11,22,33),
res = func(*args, **kwargs) # res 为None,因为index() 方法没有返回值
print("res>>>>>>", res)
‘’‘
业务代码
’‘’
return res # 返回值为None
return wrapper # 返回的是warpper的内存地址
@outter # 相当于 index = outter(index) #语法糖
def index(x, y, z):
print("index %s %s %s "%(x, y, z))
@outter # 相当于home = outter(index) #语法糖
def home(name):
print("name>>>>>%s" %name)
# 调用 outter 传入 index 方法的名字 index,
# 返回的index 就是warpper的内存地址
# index = outter(index) # 可以用语法糖 @outter
# <function outter.<locals>.wrapper at 0x0000024563E39C10>
print("index>>>>", index)
# 此处的index已经不是上边定义的index方法,而是wrapper的内存地址加(),
# 就相当于调用了wrapper(),给wrapper传值,
# 由于上边wrapper的返回值为None,所以此处res为None
res = index(11, 22, z=33)
# index(x=1,y=2,z=3)
# res = home('aa')
print(res) #None
有参装饰器
叠加多个装饰器
def deco1(func1): #@deco1调用此函数, func1是wrappper2函数返回的wrapper2的 内存地址,
# func1 是wrapper2的内存地址
# <function deco2.<locals>.wrapper2 at 0x0000021A09EE9C10>
print("func1=====>", func1)
def wrapper1(*args, **kwargs):
print("正在运行=========> deco1.wrapper1")
res1 = func1(*args, **kwargs)
return res1 #None
#返回的是wrapper1的内存地址
#<function deco1.<locals>.wrapper1 at 0x000001319A009DC0>
return wrapper1
def deco2(func2): # @deco2调用此函数, func2是wrapper3函数返回的wrapper3的内存地址
# func2 是wrapper3的内存地址
# <function deco3.<locals>.outter3.<locals>.wrapper3 at 0x0000021A09EE9D30>
print("func2=====>", func2)
def wrapper2(*args, **kwargs):
print("正在运行=========> deco2.wrapper2")
print("wrapper2===>", args, kwargs)
# 此处的func2是wrapper3的内存地址
res2 = func2(*args, **kwargs) # 1 2
return res2 #None
# 返回的是wrapper2的内存地址
# <function deco2.<locals>.wrapper2 at 0x0000027A8C7D9C10>
return wrapper2
def deco3(x): # x = 11
def outter3(func3): # @deco3调用此函数, func3 是 函数index的内存地址
# func3 是index的内存地址 <function index at 0x000001BA611E9CA0>
print("func3===>", func3)
def wrapper3(*args, **kwargs):
print("正在运行=========> deco3.outter3.wrapper3")
res3 = func3(*args, **kwargs) # 1 2
print("res3=====>", res3) # None 因为index函数没有定义返回值
return res3
print("wrapper3 =====> ", wrapper3)
# 返回wrapper3的内存地址
# <function deco3.<locals>.outter3.<locals>.wrapper3 at 0x0000023242B89D30>
return wrapper3
# 返回outter的内存地址
# <function deco3.<locals>.outter3 at 0x00000231E6BB9C10>
return outter3
# 加载顺序:自下而上
@deco1 # @deco1 相当于 index = outter1(wrapper2),此处的wrapper2得到的是wrapper2 返回的wrapper3的内存地址, 得到wrapper2 的内存地址
@deco2 # @deco2 相当于 index = outter2(wrapper3),此处的wrapper3得到的是wrapper3 返回的wrapper3的内存地址, 得到wrapper2 的内存地址 (return wrapper2)
@deco3(11) # @deco3 相当于 index = outter3(index), 此处的index是index函数的内存地址, 得到wrapper3的内存地址(return wrapper3),
def index(x, y):
print("index %s %s" % (x, y))
# 执行顺序自上而下
# 即先执行wrapper1 ==> wrapper2 ===> wrapper3
index(1, 2) # 即wrapper1(1, 2)