1. 程式人生 > >021day--python裝飾器

021day--python裝飾器

輸出 for 購物 c函數 blog led 運行時 index 基本框架

一、裝飾器含義

  裝飾器本質就是函數,為其它函數添加附加功能

二、裝飾器原則

  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裝飾器