首页 > 代码库 > 装饰器
装饰器
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__)
装饰器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。