Python3 装饰器

装饰器(decorator):

  1>定义: 本质是函数,功能是用来装饰其他函数,为其他函数添加附加功能
  2>原则:(1)不能修改被装饰函数的源代码;(2);不能修改呗装饰的函数的调用方式

  实现装饰器知识储备:(1)函数即变量(2)高阶函数(满足其一就是:一个函数作为另一个函数的入参;返回值包含函数名(3)嵌套函数
  高阶函数 + 嵌套函数 = 修饰器

1.简单的装饰器,统计接口运行时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import time
def timer(func):
    def deco(*args,**kwargs):
        start_time = time.time()
        return func(*args,**kwargs)
        end_time = time.time()
        print('the run time is %s'%(end_time-start_time))
    return deco
 
# test1 = timer(test1)
@timer
def test1(times):
    time.sleep(times)
    print('in the test1')
    return times
 
print(test1(1))

输出结果:

1
2
in the test1
1

2.模拟某些函数需要登陆验证,验证方式分为本地和ldap验证(完整版)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#模拟某些函数需要登陆验证,验证方式分为本地和ldap验证
 
userName,passWord ="Bert","abc123"  #假设是数据库用户名密码
def auth(auth_type):
    def outer_wrapper(func):
        def wrapper(*args,**kwargs):
            if auth_type == 'local':
                user_name =input('Username:').strip()
                pass_word =input('Password:').strip()
                if user_name == userName and pass_word == passWord:
                    print("用户名密码验证成功!")
                    return func(*args,**kwargs)
                else:
                    print("用户名密码验证失败!")
            elif auth_type == 'ldap':
                print('ldap方式验证登录。。。')
                return func(*args,**kwargs)
        return wrapper
    return outer_wrapper
 
def index():
    print('in the index')
    return 'index'
@auth(auth_type="local") #auth_type装饰器最外层函数的入参
def home():
    print('in the home')
    return 'home'
 
@auth(auth_type="ldap")
def bbs():
    print('in the bbs')
    return 'bbs'
 
index()
home()
bbs()
posted @ 2018-07-12 15:23  CansonHai  阅读(123)  评论(0编辑  收藏  举报