一、檢視一個函數相同的另一種方法 利用屬性:函數._name 從結果來看他們的本體都是hello函數 二、裝飾器 1.定義:在不改動代碼的基礎上無限擴展函數功能的一種機制,本質上來講,裝飾器是一個返回函數的高階函數。 2.裝飾器的使用:使用@愈發,即在每次要擴展到函數定義前使用@+函數名。 3.裝飾 ...
一、檢視一個函數相同的另一種方法
利用屬性:函數._name
def hello(): print("我是一個測試程式") f = hello print(f.__name__) print(hello.__name__)
從結果來看他們的本體都是hello函數
二、裝飾器
1.定義:在不改動代碼的基礎上無限擴展函數功能的一種機制,本質上來講,裝飾器是一個返回函數的高階函數。
2.裝飾器的使用:使用@愈發,即在每次要擴展到函數定義前使用@+函數名。
import time #對hello函數進行功能擴展,每次執行hello前列印時間 def printTime(f): # 高階函數,以函數作為參數 def wrapper(*args,**kwargs): print("Time:",time.ctime()) return f(*args,**kwargs) return wrapper #上面定義了裝飾器,使用的時候需要用到@符號,此符號是python語法 @printTime def hello(): print("Hello World") hello()
3.裝飾器的好處:
(1)裝飾器的好處是,一旦定義,則可以裝飾任意函數
(2)一旦被其裝飾,則把裝飾器的功能直接添加在定義函數的功能上
4.上面對函數的裝飾使用了系統定義的語法糖,下麵開始手動執行一下裝飾器
.......復用了上面的代碼........ def hello3(): print("厲害") hello3 = printTime(hello3) #這是向printTime傳參hello3,然後返回wrapper,也就是hello3 = wrapper hello3() #執行了hello3函數,也就是執行了wrapper函數,先列印了“厲害”然後返回了最開始的hello3,但是後面有括弧就是執行了最開始的 #hello3(),列印了厲害
5.遺留問題:
aa = printTime(hello3)
aa()
為什麼出來了兩個時間戳
三、源碼:
d20_3_wrapper
地址:https://github.com/ruigege66/Python_learning/blob/master/d20_3_wrapper
2.CSDN:https://blog.csdn.net/weixin_44630050(心悅君兮君不知-睿)
3.博客園:https://www.cnblogs.com/ruigege0000/
4.歡迎關註微信公眾號:傅里葉變換,後臺回覆”禮包“,獲取大數據學習資料