Python中裝飾器的用法

2022-05-10 17:51:42 字數 2619 閱讀 3736

定義:裝飾器本身就是乙個函式

為其他函式提供附加功能

不改變源**

不改變原呼叫方式

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

知識點:函式本身就是乙個變數(意味著可以被複製給乙個變數:test=test(1) )

高階函式把函式名當成乙個實參傳遞給另乙個函式func(test1) (不改變源**的前提下新增**)

返回值中包含函式名return deco (不改變函式的呼叫方式)

巢狀函式:函式中加入新的函式def

func1():

def func2():

典型結構:

1

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

view code

帶引數的裝飾器:

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