021day--python装饰器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了021day--python装饰器相关的知识,希望对你有一定的参考价值。
一、装饰器含义
装饰器本质就是函数,为其它函数添加附加功能
二、装饰器原则
1.不修改被修饰函数的代码
2.不修改被修饰函数的调用方式
三、装饰器知识
装饰器 = 高阶函数 + 函数嵌套 + 闭包
四、装饰器介绍
1.装饰器基本框架
def timer(func): #func为被修饰函数 def wrapper(): #函数嵌套 func() #执行func函数 return wrapper
2、基本装饰器(基本框架+参数+功能+返回值+使用装饰器+语法糖@)
import time def timmer(func): #func=test def wrapper(): # print(func) start_time=time.time() func() #就是在运行test() stop_time = time.time() print(‘运行时间是%s‘ %(stop_time-start_time)) return wrapper @timmer #test=timmer(test) timmer执行后会返回wrapper地址赋值给test def test(): time.sleep(3) print(‘test函数运行完毕‘) test()
3.加上返回值的装饰器
import time def timmer(func): #func=test def wrapper(): # print(func) start_time=time.time() res = func() #就是在运行test() stop_time = time.time() print(‘运行时间是%s‘ %(stop_time-start_time)) return res return wrapper @timmer #test=timmer(test) timmer执行后会返回wrapper地址赋值给test def test(): time.sleep(3) print(‘test函数运行完毕‘) return ‘这是test的返回值‘ res2 = test() print (res2) 输出: test函数运行完毕 运行时间是3.0001718997955322 这是test的返回值
4.加上参数的装饰器
import time def timmer(func): #func=test1 def wrapper(*args,**kwargs): #test(‘linhaifeng‘,age=18) args=(‘linhaifeng‘) kwargs={‘age‘:18} start_time=time.time() res=func(*args,**kwargs) #就是在运行test() func(*(‘linhaifeng‘),**{‘age‘:18}) stop_time = time.time() print(‘运行时间是%s‘ %(stop_time-start_time)) return res return wrapper # @timmer #test=timmer(test) def test(name,age): time.sleep(3) print(‘test函数运行完毕,名字是【%s】 年龄是【%s】‘ %(name,age)) return ‘这是test的返回值‘ @timmer def test1(name,age,gender): time.sleep(1) print(‘test1函数运行完毕,名字是【%s】 年龄是【%s】 性别【%s】‘ %(name,age,gender)) return ‘这是test的返回值‘ # res=test(‘linhaifeng‘,age=18) #就是在运行wrapper # # print(res) # test1(‘alex‘,18,‘male‘) test1(‘alex‘,18,‘male‘)
5.带参数的装饰器
1 user_list=[ 2 {‘name‘:‘alex‘,‘passwd‘:‘123‘}, 3 {‘name‘:‘linhaifeng‘,‘passwd‘:‘123‘}, 4 {‘name‘:‘wupeiqi‘,‘passwd‘:‘123‘}, 5 {‘name‘:‘yuanhao‘,‘passwd‘:‘123‘}, 6 ] 7 current_dic={‘username‘:None,‘login‘:False} 8 9 def auth(auth_type=‘filedb‘): 10 def auth_func(func): 11 def wrapper(*args,**kwargs): 12 print(‘认证类型是‘,auth_type) 13 if auth_type == ‘filedb‘: 14 if current_dic[‘username‘] and current_dic[‘login‘]: 15 res = func(*args, **kwargs) 16 return res 17 username=input(‘用户名:‘).strip() 18 passwd=input(‘密码:‘).strip() 19 for user_dic in user_list: 20 if username == user_dic[‘name‘] and passwd == user_dic[‘passwd‘]: 21 current_dic[‘username‘]=username 22 current_dic[‘login‘]=True 23 res = func(*args, **kwargs) 24 return res 25 else: 26 print(‘用户名或者密码错误‘) 27 elif auth_type == ‘ldap‘: 28 print(‘鬼才特么会玩‘) 29 res = func(*args, **kwargs) 30 return res 31 else: 32 print(‘鬼才知道你用的什么认证方式‘) 33 res = func(*args, **kwargs) 34 return res 35 36 return wrapper 37 return auth_func 38 39 @auth(auth_type=‘filedb‘) #auth_func=auth(auth_type=‘filedb‘)-->@auth_func 附加了一个auth_type --->index=auth_func(index) 40 def index(): 41 print(‘欢迎来到京东主页‘) 42 43 @auth(auth_type=‘ldap‘) 44 def home(name): 45 print(‘欢迎回家%s‘ %name) 46 # 47 @auth(auth_type=‘sssssss‘) 48 def shopping_car(name): 49 print(‘%s的购物车里有[%s,%s,%s]‘ %(name,‘奶茶‘,‘妹妹‘,‘娃娃‘)) 50 51 # print(‘before-->‘,current_dic) 52 # index() 53 # print(‘after--->‘,current_dic) 54 # home(‘产品经理‘) 55 shopping_car(‘产品经理‘)
以上是关于021day--python装饰器的主要内容,如果未能解决你的问题,请参考以下文章