没有装饰器实例:
1 #!/usr/bin/env python 2 # -*- coding:utf8 -*- 3 # Author:Dong Ye 4 5 6 #定义个全局变量,用于存放用户状态信息: 7 LOGIN_USER = {"is_login": False, "current_user": None} 8 9 10 #查看订单: 11 def order(): 12 if LOGIN_USER['is_login']: 13 print('欢迎%s登录' % LOGIN_USER['current_user']) 14 else: 15 print('请登录') 16 17 18 #修改密码: 19 def changepwd(): 20 if LOGIN_USER['is_login']: 21 print('欢迎%s登录' % LOGIN_USER['current_user']) 22 else: 23 print('请登录') 24 25 26 #后台管理: 27 def manager(): 28 if LOGIN_USER['is_login']: 29 print('欢迎%s登录' % LOGIN_USER['current_user']) 30 else: 31 print('请登录') 32 33 34 #登入 35 def login(user,pwd): 36 if user == 'alex' and pwd == '123': 37 LOGIN_USER['is_login'] = True #表示登录成功 38 LOGIN_USER['current_user'] = user #当前用户名称 39 manager() #登入成功后,就可以访问后台管理。 40 41 42 #用户输入判断: 43 def main(): 44 while True: 45 inp = input("1、后台管理;2、登录") 46 if inp =='1': 47 manager() 48 elif inp == '2': 49 username = input('请输入用户名:') 50 pwd = input('请输入密码:') 51 login(username,pwd) 52 53 54 #调用方法 55 main()
一级装饰器:(用户登录)
一个函数用一个装饰器装饰
实例1:
#!/usr/bin/env python # -*- coding:utf8 -*- # Author:Dong Ye #第一步,定义outer函数 def outer(func): #第五步、func = 原来的f1函数的内存地址 def inner(): print('hello') #第六步 print('hello') print('hello') #第七步、找到原来的f1并执行f1的函数体 #第八步、将原来f1的返回值赋值给r r = func() print('end') #第九步 print('end') print('end') print('end') return r #第十步、由于inner是被新f1的函数调用,返回原来f1的返回值,也会返回给新f1的ret变量 return inner #第二步、在python中@代码具有特殊性,只要解析器执行到@,就会有下面的2个操作: #1、执行outer函数,并且将其下面的函数名当做参数。 #2、将outer返回值重新赋值给f1 @outer def f1(): #第三步、f1接收outer的返回值变成inner的内存地址f1 = inner的内存地址 print('F1') ret = f1() #第四部、调用f1的时候,直接执行inner的函数体 #第十一步、由于inner是被新f1的函数调用,返回原来f1的返回值,也会返回给新f1的ret变量 print(ret)
实例2:
1 #定义个全局变量,用于存放用户状态信息: 2 LOGIN_USER = {"is_login": False, "current_user": None} 3 4 #装饰器: 5 def outer(func): 6 def inner(*argsm,**kwargs): 7 if LOGIN_USER['is_login']: 8 print('欢迎%s登录' % LOGIN_USER['current_user']) 9 r = func() 10 return r 11 else: 12 print('请登录') 13 return inner 14 15 16 17 18 #查看订单: 19 @outer 20 def order(): 21 print('欢迎%s登录' % LOGIN_USER['current_user']) 22 23 24 #修改密码: 25 @outer 26 def changepwd(): 27 print('欢迎%s登录' % LOGIN_USER['current_user']) 28 29 30 #后台管理: 31 @outer 32 def manager(): 33 print('欢迎%s登录' % LOGIN_USER['current_user']) 34 35 36 #登入 37 def login(user,pwd): 38 if user == 'alex' and pwd == '123': 39 LOGIN_USER['is_login'] = True #表示登录成功 40 LOGIN_USER['current_user'] = user #当前用户名称 41 manager() #登入成功后,就可以访问后台管理。 42 43 44 #用户输入判断: 45 def main(): 46 while True: 47 inp = input("1、后台管理;2、登录") 48 if inp =='1': 49 manager() 50 elif inp == '2': 51 username = input('请输入用户名:') 52 pwd = input('请输入密码:') 53 login(username,pwd) 54 55 56 #调用方法 57 main()
二级装饰器:(用户登录和权限认证)
注意:一个函数可以你被多个装饰器装饰
#!/usr/bin/env python # -*- coding:utf8 -*- # Author:Dong Ye #定义全局字典: USER_INFO = {} #判读用户登录: def check_login(func): def inner(*args,**kwargs): if USER_INFO.get('is_login',None): #如果获取不到返回None ret =func(*args,**kwargs) return ret else: print('请先登录。。。') return inner #判读用户管理: def check_admin(func): def inner(*args,**kwargs): if USER_INFO.get('user_type',None)==2: ret =func(*args,**kwargs) return ret else: print('无权限查看