Python基礎之裝飾器

2022-05-04 06:54:09 字數 1943 閱讀 1068

器即函式;

裝飾即修飾,意指為其他函式新增新功能。

裝飾器定義:本質就是函式,功能是為其他函式新增新功能。

1.不修改被裝飾函式的源**(開放封閉原則);

2.為被裝飾函式新增新功能後,不修改被修飾函式的呼叫方式。

不用傳引數來使用裝飾器。

以下的操作是為函式foo來增加新的計時功能:不改變原函式的**和呼叫方式

import time #呼叫time模組

def timmer(func): #裝飾器timmer,將函式foo的函式名為引數傳給timmer

start_time = time.time()#開始時間

func() #func=函式foo 加括號函式直接被呼叫

stop_time = time.time() #結束時間

print("函式執行的時間是%s"%(stop_time-start_time))

@timmer #裝飾器的語法@+裝飾器名,foo = timmer(foo)

def foo(): #定義的乙個無參函式

time.sleep(2) #使程式睡眠2s

print("welcome to beijing")

foo() #呼叫foo函式

---------------------以下是輸出結果----------------------

welcome to beijing

函式執行的時間是2.0

要傳引數來使用裝飾器。

以下的操作是為函式my_max來增加新的計時功能,通過裝飾器傳的引數判斷,執行對應的**,實現相應的功能:

不改變原函式的**和呼叫方式。

import time  # 呼叫time模組

#定義裝飾器階段

def choice(x=1): #通過裝飾器傳的引數(預設為1),完成下面的判斷,達到自己想要的狀態

def timmer(func): # 巢狀函式

if x == 1: #當裝飾器傳的引數是1時,就啟用計時功能

start_time = time.time() # 開始計時

func(*args, **kwargs) # func=函式my_max 加括號來呼叫函式

stop_time = time.time() # 結束計時

print("函式的執行時間是%s" % (stop_time - start_time))

elif x == 0: #當裝飾器傳的引數是0時,就不啟用計時功能

func(*args, **kwargs) # func=函式my_max 加括號來呼叫函式

print("不用計時")

return timmer #返回timmer

#呼叫裝飾器

@choice()#要加括號傳引數執行函式的 #@timmer my_max=timmer(my_max)#為my_max這個函式增加計時功能

def my_max(x, y): # 比較兩個數的大小

time.sleep(2) # 睡眠2s,方便實驗效果

res = x if x > y else y # 判斷x與y的大小

print("from the my_max,the max is %s" % res)

#呼叫函式階段

my_max(1, 2) # 呼叫函式並按位置傳參

-----------------------輸出結果----------------------

from the my_max,the max is 2 #這是使用的預設引數的結果

函式的執行時間是2.0

#當@choice(0) 時

-----------------------輸出結果----------------------

from the my_max,the max is 2 #choice傳的引數是0的結果

不用計時

python基礎之裝飾器

裝飾器的本質是乙個閉合函式,該閉合函式的自由變數是乙個函式,可以使 的重要性與擴充套件性大大加強。通過 後新增裝飾器函式 def checkparams fn 只接受字串的裝飾器 if isinstance strname,str 判斷是否是字串型別 return fn strname 如果是則呼叫...

Python基礎之裝飾器

器 工具 裝飾 新增新功能 裝飾器就是定義乙個函式,用該函式去為其他函式新增新功能開放封閉原則 針對上線的功能對拓展是開放的,但是對修改源 以及呼叫方式是封閉的 裝飾器就是在遵循開放封閉原則的前提下為被裝飾物件新增新功能 1 不修改被裝飾物件的源 1 不修改被裝飾物件的呼叫方式 需求 為index加...

python基礎之裝飾器

裝飾器 本質就是函式,功能是為其他函式新增附加功能 原則 1.不修改被修飾函式的源 2.不修改被修飾函式的呼叫方式 裝飾器的知識儲備 裝飾器 高階函式 函式巢狀 閉包 高階函式 1.函式接收的引數是乙個函式名 2.函式的返回值是乙個函式名 3.滿足上述條件任意乙個,都可稱之為高階函式 以下 實現了為...