python 裝飾器 Decorators 介紹

2021-09-24 14:45:59 字數 2088 閱讀 3345

為什麼要裝飾器

假設現在程式實現了say_hello()say_goodbye()兩個函式。

import time

def say_hello():

time.sleep(1)

print("say_hello!")

def say_goodbye():

time.sleep(1)

print("say_goodbye!") # bug here

if __name__ == '__main__':

say_hello()

say_goodbye()

這時候我們需要知道每個方法從開始到結束花了多常時間要怎麼實現呢

好,小a他是這樣實現的。

import time

def say_hello():

start_time=time.time()

time.sleep(1)

print("say_hello!")

end_time=time.time()

print(end_time-start_time)

def say_goodbye():

start_time=time.time()

time.sleep(1)

print("say_goodbye!")

end_time=time.time()

print(end_time-start_time)

if __name__ == '__main__':

say_hello()

say_goodbye()

# 輸出結果:

#say_hello!

#1.0002422332763672

#say_goodbye!

#1.0095882415771484

這樣需求就實現了,不過在現實生活中多方法都是很久之前寫的,這樣改動**說不定就埋下了坑,那我們如何做到不改變現有的函式,去實現新功能呢

這時候就是裝飾器登場表現的時候了

# author:picahealth

# contact: [email protected]

# datetime:2019/3/22 22:02

# software: pycharm

"""檔案說明: 計時裝飾器

"""import time

def decorator(func):# 這裡需要了解如何將函式做為一階引數

"""這是個計時裝飾器

"""start_time = time.time()

func()

end_time = time.time()

print(end_time-start_time)

@decorator

def say_hello():

time.sleep(1)

print("say_hello!")

#只需要在函式的定義前加上@和裝飾器的名稱

@decorator

def say_goodbye():

time.sleep(1)

print("say_goodbye!")

if __name__ == '__main__':

say_hello()

say_goodbye()

# 輸出結果:

#say_hello!

#1.0002422332763672

#say_goodbye!

#1.0095882415771484

總結:

裝飾器本質上是乙個python函式,它可以讓其他函式在不修改任何**的前提下增加額外功能。

本質是先執行裝飾器,把函式當做引數傳過去,在裝飾器內部呼叫函式

它經常用於有切面需求的場景,比如:插入日誌、效能測試、事務處理、快取、許可權校驗等場景。

如果對以上**原理還是不了解需要先看一下:高階函式+巢狀函式

更多細節參考:python 使用裝飾器處理日誌

Python基礎知識之裝飾器decorator

本質是函式,裝飾其他函式 為其他函式新增附加功能。不能修改被裝飾的函式的源 不能修改被裝飾的函式的呼叫方式 高階函式 巢狀函式 裝飾器 1.函式即 變數 定義乙個函式就相當於定義乙個變數,即將函式體賦值給乙個變數名。python的記憶體 機制規定 當儲存在記憶體中的內容沒有對應的變數名指定時,則當記...

python裝飾器 Python 裝飾器

簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...