个人的一些理解,可能会有错误,有问题请指正。
装饰器总结
# 不带参数的装饰器
def test(func): # 第二步 rel = test(rel) 返回inner 新rel = inner
print('这是装饰器外层')
def inner(*args): # 第四步 执行inner()
print('这是装饰器内层')
func(*args) # 第五步 执行第二步传进来的老rel()函数
print('被装饰函数已执行')
return inner
@test # 第一步,先执行装饰器 @test相当于rel = test(rel) 把rel函数名传进装饰器里
def rel(*args):
print('这是被装饰的函数')
rel('123', '234') # 第三步 rel 实际是装饰器return的 inner的内存地址,执行rel()相当用执行inner()
结论:当调用rel()时,其实相当于调用了test(rel),通过test里的功能以后,就会自动调用rel功能
-----------------------------------------------------------------------------------------------------
# 带参数的装饰器
def test(type): # 第二步 type = 'qq' 向下执行返回outer
print('这是装饰器外层')
def outer(func): # 第四步,把rel函数名传进outer函数 返回inner
def inner(*args): # 第六步,执行inner及被装饰器装饰的rel()函数
if type == 'qq':
print('这是装饰器内层')
func(*args)
print('被装饰函数已执行')
else:
print('just qq')
func(*args)
return inner
return outer
@test('qq') # 第一步,执行装饰器传入参数'qq' test = test('qq') 第三步,rel = outer(rel)
def rel(*args):
print('这是被装饰的函数')
@test('weixin')
def rel1(*args):
print('这是被装饰的函数2')
rel('123','2323') # 第五步,rel() = inner(),当调用rel函数时,实际调用的是之前outer(rel)返回的inner的内存地址
rel1()