Python之實戰裝飾器拆解

2021-09-07 02:36:57 字數 4309 閱讀 9242

目錄

1.函式既」變數」 屬於可變化資料

2.高階函式

3.巢狀函式

函式是無關順序的,但是執行呼叫的函式必須在執行**前面

示例:變數:

a=[1,2]  #a為變數名,[1,2]存放記憶體裡面 ==專業稱之變數體
函式:

def test1():

.....

#test1==該函式的名字(如變數名a)

#():內的** == [1,2]存放在記憶體裡面 ==專業稱之函式體

#注意2:變數體(函式體)必須最少擁有乙個變數名(函式名),否則記憶體**

a:把乙個函式名當做實參傳給另外乙個函式的函式:

通過實驗得到:在不修改被裝飾函式源**的情況下為其新增了功能

b:返回值中包含函式名

通過實驗得到:不修改函式的呼叫方式和源**也可以新增功能

示例:

import time

def bar():

time.sleep(3)

print('in the bar')

def test2(func):

print(func)

return func

test2(bar)()

#bar獲取的是函式bar函式的記憶體位址

#bar()才是執行該函式

高階函式+巢狀函式=裝飾器

示例:

import time

def timmer(func):

def warpper(*args,**kwargs):

start_time = time.time()#開始時間

func()#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)

stop_time = time.time()#結束時間

print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-

return warpper

def test():

time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作

print('in the test')

a=timmer(test)  # a == warpper

a()             # a()==warpper()

#timmer(test)() == warpper()等於上面兩條命令

詳解:

timmer(test1)

得到的是

warpper

的該函式記憶體位址

timmer(func)  func=test

該函式體

賦值a  a() ==warpper()

全域性變數和區域性變數規則,意味著

warpper()

可以呼叫

timmer

函式的形參

func

最終執行了

func()  == test() 

timmer

函式符合高階函式,和巢狀函式,所以是裝飾器

經過python

優化以後裝飾器呼叫變成如下:

@timmer

裝飾到指定的函式如

def test1()

上面:

import time

def timmer(func):

def warpper(*args,**kwargs):

start_time = time.time()#開始時間

func()#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)

stop_time = time.time()#結束時間

print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-

return warpper

@timmer#呼叫裝飾器,在需要裝飾的函式的上方

def test():

time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作

print('in the test')

test()

#帶裝飾器和正常寫法的轉換:

#func = test

#test = timmer(test)   ==  warpper

#test()=timmer(test)()  ==   warpper()

test該函式有形參怎麼辦?

1.我們知道

func = test  

2.timmer(test1)

得到的是

warpper

的該函式記憶體位址賦值到

test

3.test() == warpper() 

4. warpper

函式增加引數組(元祖和字典)

5. test(1,2) == warpper(1,2)     warpper

函式執行

func

的時候在把形參給

func就ok

了fun(1,2)

示例:

import time

def timmer(func):

def warpper(*args,**kwargs):

start_time = time.time()#開始時間

func(args[0], args[1])#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)

stop_time = time.time()#結束時間

print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-

return warpper

@timmer#呼叫裝飾器,在需要裝飾的函式的上方

def test(a,b):

time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作

print('in the test')

test(1,2)

#帶裝飾器和正常寫法的轉換:

#func = test

#test = timmer(test)   ==  warpper

#test1(1,2)=timmer(test)(1,2)  ==   warpper(1,2)

#func(args[0], args[1]) == test(1,2)

test該函式有return怎麼辦?

示例:

import time

def timmer(func):

def warpper(*args,**kwargs):

start_time = time.time()#開始時間

res = func(args[0], args[1])#呼叫開始時間(該裝飾我還不清楚,目前這樣解釋)

stop_time = time.time()#結束時間

print('the func run time is %s' %(stop_time-start_time))#列印顯示***開始時間-

return res

return warpper

@timmer#呼叫裝飾器,在需要裝飾的函式的上方

def test(a,b):

time.sleep(3)#間隔3秒,也就是被呼叫了執行到該步驟的時候停3秒,繼續往下操作

return 1

res = test(1,2)

高階裝飾器(其實都是一樣)

Python裝飾器實戰

結論 一般的裝飾器在裝飾api函式時登入驗證在上 鑑權在下,意即,先登入 再 鑑權 寫在前面閉包 閉包範例def out func variable this is out variable definner print variable func return inner 函式裝飾器import ...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...