装饰器

装饰器

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)

posted @ 2021-11-25 19:05  晨^O^黎  阅读(34)  评论(0编辑  收藏  举报