021day--python裝飾器
阿新 • • 發佈:2017-05-04
輸出 for 購物 c函數 blog led 運行時 index 基本框架
一、裝飾器含義
裝飾器本質就是函數,為其它函數添加附加功能
二、裝飾器原則
1.不修改被修飾函數的代碼
2.不修改被修飾函數的調用方式
三、裝飾器知識
裝飾器 = 高階函數 + 函數嵌套 + 閉包
四、裝飾器介紹
1.裝飾器基本框架
def timer(func): #func為被修飾函數 def wrapper(): #函數嵌套 func() #執行func函數 return wrapper
2、基本裝飾器(基本框架+參數+功能+返回值+使用裝飾器+語法糖@)
import time deftimmer(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 resreturn 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裝飾器