裝飾器:本質就是函式,功能是為其他函式新增附加功能
原則:1.不修改被修飾函式的源**
2.不修改被修飾函式的呼叫方式
裝飾器的知識儲備:
裝飾器=高階函式+函式巢狀+閉包
高階函式:
1.函式接收的引數是乙個函式名
2.函式的返回值是乙個函式名
3.滿足上述條件任意乙個,都可稱之為高階函式
以下**實現了為函式foo增加乙個新的功能,計算函式執行時間。函式接收的引數是乙個函式名,所以是乙個高階函式,不過卻改變了函式的呼叫方式,需要呼叫test(foo),所以不算乙個裝飾器
import接下來的**滿足高階函式,也滿足不改變函式的呼叫方式,不過多執行了一次,不符合要求time
deffoo():
time.sleep(3)
print("
我很好,謝謝你的關心
")
deftest(func):
print("
你好嗎"
) start_time =time.time()
func()
stop_time =time.time()
print("
函式執行的時間為 %s
" % (stop_time-start_time))
test(foo)
def加上函式巢狀,就可以達到裝飾器的效果foo():
time.sleep(3)
print("
我很好,謝謝關心
")
deftest(func):
print("
你好嗎"
) start_time =time.time()
func()
stop_time =time.time()
print("
函式的執行時間為 %s
" % (stop_time-start_time))
return
func
foo =test(foo)
foo()
def不過也不是很完美,多了foo=test(foo)的呼叫,所以為了省去這步調用,對其他函式也可以,用如下**foo():
time.sleep(3)
print("
我很好,謝謝你的關心
")
deftest(func):
print("
你好嗎"
)
deftest1():
start_time =time.time()
func()
stop_time =time.time()
print("
函式執行的時間為 %s
" % (stop_time-start_time))
return
test1
foo
=test(foo)
foo()
def至此,乙個簡單的裝飾器就完成了。test(func):
print("
你好嗎"
)
deftest1():
start_time =time.time()
func()
stop_time =time.time()
print("
函式執行的時間為 %s
" % (stop_time-start_time))
return
test1
@test
#相當於foo=test(foo)
deffoo():
time.sleep(3)
print("
我很好,謝謝你的關心
")
foo()
接下來可以替它美化功能。
美化1.如果函式裡面帶有引數,該怎麼處理呢,畢竟每個函式的引數個數什麼的都不確定。解決方法如下:注意看標紅部分。
def美化2:如果函式裡面帶有返回值又該如何處理呢。test(func):
print("
你好嗎"
)
def test1(*args,**
kwargs):
start_time =time.time()
func(
*args,**
kwargs)
stop_time =time.time()
print("
函式執行的時間為 %s
" % (stop_time-start_time))
return
test1
@test
deffoo(name,age):
time.sleep(3)
print("
我很好,謝謝你的關心")
print("
我是%s
" %name)
print("
我今年%s歲
" %age)
foo(
'alex
',18)
deftest(func):
print("
你好嗎"
)
def test1(*args,**kwargs):
start_time =time.time()
res = func(*args,**kwargs)
stop_time =time.time()
print("
函式執行的時間為 %s
" % (stop_time-start_time))
return
res
return
test1
@test
deffoo(name,age):
time.sleep(3)
print("
我很好,謝謝你的關心")
print("
我是%s
" %name)
print("
我今年%s歲
" %age)
return
age
foo(
'alex
',18)
python基礎之裝飾器
裝飾器的本質是乙個閉合函式,該閉合函式的自由變數是乙個函式,可以使 的重要性與擴充套件性大大加強。通過 後新增裝飾器函式 def checkparams fn 只接受字串的裝飾器 if isinstance strname,str 判斷是否是字串型別 return fn strname 如果是則呼叫...
Python基礎之裝飾器
器 工具 裝飾 新增新功能 裝飾器就是定義乙個函式,用該函式去為其他函式新增新功能開放封閉原則 針對上線的功能對拓展是開放的,但是對修改源 以及呼叫方式是封閉的 裝飾器就是在遵循開放封閉原則的前提下為被裝飾物件新增新功能 1 不修改被裝飾物件的源 1 不修改被裝飾物件的呼叫方式 需求 為index加...
Python基礎之裝飾器
器即函式 裝飾即修飾,意指為其他函式新增新功能。裝飾器定義 本質就是函式,功能是為其他函式新增新功能。1.不修改被裝飾函式的源 開放封閉原則 2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式。不用傳引數來使用裝飾器。以下的操作是為函式foo來增加新的計時功能 不改變原函式的 和呼叫方式 im...