假想现在有这样一个场景:原来基础平台有支付订单功能,共业务层调用,但是现在需要对支付功能添加登录验证需求,在不改变基层代码的基础上,扩展功能
1、装饰器使用一:一秒看懂装饰器执行原理
def w1(func):
def login():
# 验证1
# 验证2
# 验证3
return func()
return login
@w1
def order():
print('f1')
以上代码执行步骤:python解释器就会从上到下解释代码:
第一步:读到def w1(func):会将w1函数加载到内存中,不会调用(因为函数在没有被调用之前其内部代码不会被执行)
第二步:因为不会执行函数内部逻辑,所以下一步直接执行 @w1:
关于@w1执行:该语法的意思就是,执行函数w1,并将被该装饰器装饰的函数order作为装饰器w1的参数,即@w1=w1(order)
第三步:python解释到@w1的时候,此时w1函数真正执行内部逻辑:
def login():
# 验证
return func() #此是这里相当于 执行order()
return login #返回包装后的函数,此时的函数login既包含验证功能,也保留order功能
其实就是将原来的 f1 函数塞进另外一个函数中
第四步:执行完w1函数之后,将函数返回值login赋值给函数名order,此时的order也就是:
新order=def login():
# 验证
return func()
其实这里的 order() 就等价于 login()
2、装饰器使用二:细看带参数的装饰器
用第二层函数login接受参数,并传递下去,前面一说过这个:
def w1(func):
def login(*args ,**kwargs):
# 登录校验
return func(*args ,**kwargs)
return login
@w1
def order(*args ,**kwargs):
print('run order',args,kwargs)
order(1,4,5,name='python')
'''
运行结果:
run order (1, 4, 5) {'name': 'python'}
'''
3、装饰器使用三:一个函数可以被多个装饰器装饰
def w1(func):
def login():
# 登录校验
print('wwwwwwwwwww')
return func()
return login
def w2(func):
def logout():
# 退出登录校验
print('dddddddddddd')
return func()
return logout
@w1
@w2
def order():
print('run order')
order()
'''
运行结果:
wwwwwwwwwww
dddddddddddd
run order
'''