装饰器
装饰器
dict={'islogin':False}
def login():
username=input('请输入用户名:\n')
password= input('请输入密码:\n')
if username=='chenli'and password=='123':
dict['islogin']=True
else:
return False
def order():
if dict['islogin']:
print('已授权')
else:print('请登录')
def admin():
if dict['islogin']:
print('已授权')
else:print('请登录')
def main():
while True:
f=int(input('1、登录 2、财务 3、核心 4、返回\n'))
if f==1:
login()
elif f==2:
order()
elif f==3:
admin()
else:break
if __name__ == '__main__':
main()
问题?
登录一直修改,导致其他模块一直修改,我只想查看订单数据和
后台数据,不想修改是否登录成功的逻辑,但是还需要查看系统
本身的业务。
解决问题:装饰器需要解决的是把判断登录成功单独的分离出来,就只
需要在一地方维护。
dict={'islogin':False}
def outer(func):
def inner():
if dict['islogin']:
return func()
else:
print('请登录系统')
return inner
def login():
username=input('请输入用户名:\n')
password= input('请输入密码:\n')
if username=='chenli'and password=='123':
dict['islogin']=True
else:
return False
@outer
def order():
# if dict['islogin']:
print('已授权')
# else:print('请登录')
@outer
def admin():
# if dict['islogin']:
print('已授权')
# else:print('请登录')
def main():
while True:
f=int(input('1、登录 2、财务 3、核心 4、返回\n'))
if f==1:
login()
elif f==2:
order()
elif f==3:
admin()
else:break
# if __name__ == '__main__':
main()
解读:
1、被装饰的函数其实在装饰器里面是装饰器函数的形式函数,可以说func=order func=admin
2、被装饰的函数真正执行的时候,其实本质上执行的是装饰器的函数,因为被装饰的函数这个时候其实已经是装饰
器函数的内层函数
3、一旦结合装饰器后,调用被装饰的函数其实执行的是inner函数的内部函数,原来的被装饰的函数被覆盖;
4、一旦这个函数被装饰器装饰之后,被装饰的函数重新赋值成装饰器的内层函数
依据如上,我们可以总结出,它执行的顺序具体为:
先执行outer的函数
再执行内部函数inner
下来执行到inner函数的返回值
再具体到inner的函数,执行inner函数里面的表达式
from 包.被调⽤的模块 import 被调⽤的模块
import qwer.longout
qwer.longout.int()
print(qwer.longout.name)
from qwer.second.longout import * int() print(name)

浙公网安备 33010602011771号