装饰器
装饰器
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)