python從零開始 21 裝飾器

2021-08-20 02:04:17 字數 3000 閱讀 6159

裝飾器:本質是乙個python函式,它的功能是讓其它函式在不需要做任何**變動的情況下,額外增加功能。

這篇文章寫的很好,我將鏈結位址放這裡:

小白如何一步步寫乙個簡單的裝飾器: 

step1.裝飾器需要將需要裝飾的函式作為入參,下面例子中的func就代表被裝飾的函式。所以第一步就是定義乙個裝飾器函式,其引數為func。

def  deco(func):

step2:第二步是定乙個返回函式,該函式用來包裝func,即乙個包括了func功能,然後同時加入了擴充套件**的返回函式。

def deco(func):

def deco(func):

func(*args, **kwargs)

def deco(func):

****** #func執行前執行的**

func(*args, **kwargs)

****** #func執行後執行的**

step 5:使用

@ deco

funcaaa()

@deco

funcbbb(ss, dd, *tuple1, **key1)

import time

def deco_time(func):

begin_time = time.time()

func(*args, **kwargs)

end_time = time.time()

process_time = (end_time - begin_time) * 1000

print("{}執行時間為{}毫秒。".format(func.__name__, process_time))

@deco_time

def sleep_1sec_func(str_for_print):

print(str_for_print)

time.sleep(1)

@deco_time

def sleep_2sec_func():

time.sleep(2)

s1 = "使用等待1秒"

sleep_1sec_func(s1)

sleep_2sec_func()

使用等待1秒

sleep_1sec_func執行時間為1000.0572204589844毫秒。

sleep_2sec_func執行時間為2000.1144409179688毫秒。

寫乙個帶引數的裝飾器:

有些情況裝飾器需要帶引數,以獲取更高的靈活度,具體的寫法步驟如下:

step1.裝飾器需要將需要裝飾的函式作為入參,下面例子中的func就代表被裝飾的函式。所以第一步就是定義乙個裝飾器函式,其引數為func。

def  deco(func):

step2:第二步是定乙個返回函式,該函式用來包裝func,即乙個包括了func功能,然後同時加入了擴充套件**的返回函式。

def deco(func):

def deco(func):

func(*args, **kwargs)

step4:加上帶引數的函式

def add_para_deco(para):        # para為引數

def deco(func):

func(*args, **kwargs)

return deco#注意要加返回函式deco

def add_para_deco(para):        # para為引數

def deco(func):

if para = "***": 

yyyyyyyy

else: 

kkkkkkk

func(*args, **kwargs)

return deco   #注意要加返回函式deco

step 6: 使用

@add_para_deco("***")

def sleep_1sec_func(***x):

******

import time

def log_time(timing):

def deco_time(func):

begin_time = time.asctime(time.localtime(time.time()))

func(*args, **kwargs)

end_time = time.asctime(time.localtime(time.time()))

if timing == "begin":

print("{}開始執行的時間為{}".format(func.__name__,begin_time))

elif timing == "end":

print("{}結束執行的時間為{}".format(func.__name__,end_time))

else:

print("對{}裝飾logtime時輸入的引數錯誤".format(func.__name__))

return deco_time

@log_time("end")

def sleep_1sec_func(str_for_print):

print(str_for_print)

time.sleep(1)

@log_time("begin")

def sleep_2sec_func():

time.sleep(2)

if __name__ == "__main__":

s1 = "使用等待1秒"

sleep_1sec_func(s1)

sleep_2sec_func()

Python從零開始 day9 裝飾器 1

裝飾器 作用域 高階函式,閉包 閉包 在乙個內部函式裡,對乙個外部作用域進行引用,那麼這個內部函式被認為是閉包 def f x 5 def fo 內部函式 print x 5 x是外部環境的變數 return fo fo 就是乙個閉包 f foo f 不能直接呼叫fo 函式,區域性變數,全域性變數無...

從零開始學Python

第三章 字典 1.建立字典 book 其中值可以是任意型別,可以是元組或者字典.2.dict函式建立字典 通過對映建立 book d book.dict 輸出d book 通過關鍵字建立 d dict name zq age 1 輸出d 3.字典的格式化字串 鍵 s 字典名 book name is...

從零開始學Python

第十一章 檔案操作 1.開啟檔案 用open 函式,直接用就可以。open name mode buffering 呼叫open 之後會返回乙個檔案物件,mode 模式,buffering 緩衝都是可以選擇的。f open r 檔案路徑 2.檔案模式 r 讀模式 w 寫模式 a 追加模式 b 二進位...