定義:裝飾器本身就是乙個函式
為其他函式提供附加功能
不改變源**
不改變原呼叫方式
裝飾器=高階函式+巢狀函式
知識點:函式本身就是乙個變數(意味著可以被複製給乙個變數:test=test(1) )
高階函式把函式名當成乙個實參傳遞給另乙個函式func(test1) (不改變源**的前提下新增**)
返回值中包含函式名return deco (不改變函式的呼叫方式)
巢狀函式:函式中加入新的函式def
func1():
def func2():
典型結構:
1view codedeffunc1(test):
2def
deco():3#
progress
4return deco#
返回函式的位址,達到不改變呼叫方式的目的
完整程式:
#view code__author__panda-j____
import
time
def timer(func): #
for test1 & 2
start_time =time.time()
func()
#run func and test its running time
end_time =time.time()
print("
this func running time is %s
" % (end_time -start_time))
return
func
@timer
deftest1():
time.sleep(1)
print("
this is test1")
@timer
deftest2():
time.sleep(1)
print("
this is test2")
test1()
test2()
帶引數的裝飾器:
1本段程式的結果是#__author__panda-j____23
import
time45
6def timer(func): #
for test1 & 2
7def deco(*args,**kwargs):#不定引數
8 start_time =time.time()
9 func(*args,**kwargs) #
run func and test its running time
10 end_time =time.time()
11print("
this func running time is %s
" % (end_time -start_time))
12return
deco
1314
@timer
15def
test1():
16 time.sleep(1)
17print("
this is test1")
1819
2021
@timer
22def
test2(arg1):
23 time.sleep(1)
24print("
this is test2,
",arg1)
2526
27print
(test1())
28 test2("
name
")
this is問題:test1
this func running time
is 1.000265121459961none
this
istest2, name
this func running time
is 1.0000722408294678
1 為什麼print(test1)會為none,原因是因為在裝飾器中沒有返回(return)任何數值給到test1中。沒有可以列印的內容。
2 在28行中,test2有乙個位置引數name傳給了裝飾器deco中,此處的arg=「name」
如果裝飾器本身也帶引數的情況:
需求:三層網頁,分別為index,home,bbs。在登陸home和bbs頁面的時候需要輸入不同的使用者名稱和密碼,正確方可執行對應函式。
思路:
定義三個函式
加裝飾器
用不同的使用者名稱和密碼(乙個為本地local,乙個為ldap)
完整程式
我所能理解的裝飾器的應用場景和關鍵知識點都歸納了,歡迎各位指正。
Python中裝飾器的用法
裝飾器的作用 當我們需要為函式拓展新的功能,但是又不能修改函式的內部結構時,就可以通過裝飾器來完成。通過裝飾器為函式拓展功能符合 對於擴充套件是開放的,對於修改是封閉的 這一開閉原則。下面我們將通過六個步驟了解如何使用裝飾器。步驟一 我們先定義乙個函式f,現在我們需要為其新增執行時列印出當前時間的功...
python中裝飾器
對修改是封閉的,對擴充套件是開放的 import time def f1 print time.time print this is a function.def f2 print this is a function.print time.time f1 def print current tim...
python中裝飾器的原理及用法
要想理解python中裝飾器的原理首先要明白一下兩點 2 裝飾器的的作用等價於callfucn decfucn callfucn 這兩點在後期的分析中要牢牢的記住。以一段 為例 def decofun func def deco a,b print before callfunc called.fu...