设为首页 加入收藏

TOP

装饰器--装饰器的种类(一)
2017-12-19 17:24:58 】 浏览:396
Tags:装饰 种类

没有装饰器实例:

 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('无权限查看
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇装饰器--万能传参 下一篇selectors

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目