python基礎之裝飾器

2022-06-12 08:32:58 字數 3234 閱讀 7177

裝飾器:本質就是函式,功能是為其他函式新增附加功能

原則: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():

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()

不過也不是很完美,多了foo=test(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

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)

美化2:如果函式裡面帶有返回值又該如何處理呢。

def

test(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...