首页 > 代码库 > 装饰器

装饰器

1、定义:假设我们要增强一个函数的功能,比如,在函数调用前后自动打印日志,但又不希望改变这个函数的源代码,这种在代码运行期间动态增加功能且又不改变源代码的方式,成为装饰器(Decorator)。本质上,decorator就是一个返回函数的高阶函数

2.实例

技术分享

 如上图中的原函数为index(),我们通过装饰器为其增加了一个计算运行时间的功能,但是没有改变源代码,这就是为其增加了一个装饰器,装饰器的功能就是计时。

 关键点:@的语法,@timmer等同于进行了如下操作:index=timmer(index),函数名+()就是调用函数,一定要记住!!好多地方想不通原因就是在这里!

 思想就是把部内函数func()换成被装饰函数index()然后再运行闭包函数就好了(可能说的有点简单)

3、给认证装饰器增加一个登陆后再次调用是免认证的功能(字典,只在内存中能行)

import timecurrent_login = {‘name‘: None, ‘login‘: False}  # 建立一个字典,字典存储登录状态def timmer(func):    def wrapper():        start_time = time.time()        func()        stop_time = time.time()        print(‘run time is %s‘ % (stop_time - start_time))    return wrapperdef auth2(auth_type=‘file‘):    def auth(func):        def wrapper(*args, **kwargs):            if current_login[‘name‘] and current_login[‘login‘]:  # 判断状态是否被激活,若激活直接执行函数结束                res = func(*args, **kwargs)                return res            if auth_type == ‘file‘:                name = input(‘username:‘)                password = input(‘password:‘)                if name == ‘zhejiangF4‘ and password == ‘sb945‘:                    print(‘auth successful‘)                    res = func(*args, **kwargs)                    current_login[‘name‘] = name  # 存储登录状态                    current_login[‘login‘] = True                    return res                else:                    print(‘auth error‘)            elif auth_type == "sql":                print("haibuhui")        return wrapper    return auth@timmer@auth2(auth_type="file")def index():    print(‘welcome to index page‘)@auth2("file")def home():    print("welcome to home page")index()home()  # 第一次执行index()函数是需要登录认证,但第二次执行home时就不需要再认证了

  

 4.帮助信息

import timedef timmer(func):    def wrapper(*args,**kwargs):        ‘ssssss‘        start_time=time.time()        func(*args,**kwargs)   #home(name)        stop_time=time.time()        print(‘run time is %s‘ %(stop_time-start_time))    return wrapper@timmerdef func(x):    ‘fun test‘    print(x)func(1)print(func.__doc__)    ###输出wrapper帮助信息#print(help(func))# import time# from functools import wraps# def timmer(func):#     @wraps(func)#     def wrapper(*args,**kwargs):#         ‘ssssss‘#         start_time=time.time()#         func(*args,**kwargs)   #home(name)#         stop_time=time.time()#         print(‘run time is %s‘ %(stop_time-start_time))#     return wrapper## @timmer# def func(x):#     ‘fun test‘#     print(x)## func(1)# print(func.__doc__)    ###输出wrapper帮助信息# #print(help(func))#输出func帮助信息

  

import timefrom functools import wraps#从函数工具中调用wraps模块def timmer(func):    @wraps(func)#它就可以让你打印出的index.__doc__编程原函数的"dashabi"而不是wrapper函数的"000"    def wrapper(*args,**kwargs):        ‘000‘        start_time=time.time()        res=func(*args,**kwargs)        stop_time=time.time()        print(‘run time is %s‘%(stop_time-start_time))        return res    return wrapper@timmerdef index():    "dashabi"    print("from index")index()print(index.__doc__)

  

 

 

装饰器