裝飾器
一、定義
1.裝飾者:本質是函數
2.功能:用來裝飾其他函數,為其他函數新增附加功能
二、原則
1.不能修改被裝飾函數的原始碼
2.不能修改被裝飾函數的呼叫方式
三、實作裝飾器
1.函數即變數 的概念
#2.高階函數
##3.巢狀函數>> 高階函數+ 巢狀函數= 裝飾器四、函數即變數1、函數與變數的類比x = 1 print(id(x)) def test(): pass print(test) #输出 1842348496 <function></function>
def test(): print("in the test.") f=test f() #输出 in the test.
x = 1 y = x print(y) #输出 1
python中記憶體的表現形式
我們把綠方塊當作是內存,每一個小方塊就是變數或函數在記憶體當中的位址。而變數名稱(x)或函數名稱(test),我們可以形象的將他們比喻為門牌號碼。當需要呼叫變數或函數的時候,我們只要引用他們的門牌號碼就可以找到他們的記憶體位址並返回。只是函數的運算需要加(),如 test()。
既然呼叫變數其實就是引用變數的記憶體位址,而呼叫函數名稱同樣可以得到函數體的記憶體位址。我們就可以把函數名稱當作變數名傳給函數,即函數就是變數。而將函數當作參數的函數,也就是高階函數。 五、高階函數滿足下列條件之一就是高階函數#1.把一個函數名稱當作實參傳給另一個函數2.傳回值包含函數名稱1)函數名稱作為參數
import time def test1(): time.sleep(2) print("in the test1.") def test2(func): start_time = time.time() func() stop_time = time.time() print("The action time of program is {}".format(stop_time-start_time)) test2(test1) #输出 in the test1. The action time of program is 2.0012054443359375
def test1(): time.sleep(2) print("in the test1.") def test2(func): print(func) return func test1 = test2(test1) test1() #输出 <function> in the test1.</function>
def foo(): print("in the foo") def bar(): print("in the bar") bar() foo()
def test1(): print("in the test1.") def test2(): test1()
局部作用域和全域作用域的存取順序
x = 0 def grandpa(): x = 1 def dad(): x = 2 def son(): x = 3 print(x) son() dad() grandpa() #输出 3
import time def timer(func): # timer(test1) func = test1 def deco(): start_time = time.time() func() # run test1() stop_time = time.time() print("the action time of the program is {}".format(stop_time-start_time)) return deco # 返回了deco的内存地址 def test1(): time.sleep(2) print("in the test1.") test1 = timer(test1) test1() # 输出 in the test1. the action time of the program is 2.0003786087036133
import time def timer(func): # timer(test1) func = test1 def deco(): start_time = time.time() func() # run test1() stop_time = time.time() print("the action time of the program is {}".format(stop_time-start_time)) return deco # 返回了deco的内存地址 @timer # test1 = timer(test1) def test1(): time.sleep(2) print("in the test1.") test1()
以上是裝飾器decorator詳解及實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!