国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

簡單上手Python中裝飾器的使用

2019-11-25 17:11:43
字體:
供稿:網(wǎng)友

Python的裝飾器可以實現(xiàn)在代碼運行期間修改函數(shù)的上下文, 即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作, 而函數(shù)本身并沒有任何的改變。

這個看起來很復(fù)雜, 實際上應(yīng)用到了我之前說過的閉包的概念, 仔細(xì)看一看, 其實并不復(fù)雜。

首先, 我們先定義一個函數(shù), 這個函數(shù)可以輸出我的個人昵稱:

def my_name():  print "Yi_Zhi_Yu"my_name() # Yi_Zhi_Yu

那假如我需要在個人昵稱輸出前, 在輸出我的個人uid呢, 當(dāng)然, 要求是不改動現(xiàn)有的my_name函數(shù), 這個時候就可以使用裝飾器了

首先, 裝飾器也是個函數(shù), 其次, 他需要接受一個參數(shù),該參數(shù)表示了要被裝飾的函數(shù)(即my_name):

def my_info(func):  def wrapper(*args, **params):    print 218    return func(*args, **params)  return wrapper

然后與相應(yīng)的被裝飾函數(shù)關(guān)聯(lián)起來的方法就是使用@my_info寫在被裝飾函數(shù)的前面

@my_infodef my_name():  print "Yi_Zhi_Yu"

最后, 在執(zhí)行my_name的時候, 就能既輸出我的uid, 又能輸出我的昵稱了

my_name()#218#Yi_Zhi_Yu

在上面, 最讓我們疑惑的是裝飾器函數(shù)定義里面的wrapper函數(shù), 裝飾器本身返回的是wrapper函數(shù)的定義, 而wrapper中則定義了對被裝飾函數(shù)(my_name)的調(diào)用, func表示的就是被裝飾函數(shù), 說白了, 裝飾器只是把某個不得改動的函數(shù)(a)放到另一個函數(shù)(b)中, 在b里面調(diào)用a, 在調(diào)用前后就可以做所謂的看起來像裝飾的工作了。
my_info的最終返回的wrapper函數(shù)的定義, 并不是執(zhí)行結(jié)果,只有當(dāng)wrapper真正執(zhí)行的時候, 才會真正的執(zhí)行my_name方法, 這就是閉包時所說的內(nèi)容。
wrapper中的參數(shù), 實際上則是傳遞給func(實際上是my_name)的參數(shù)

因為裝飾器也是個函數(shù), 那么裝飾器自己的能不能有參數(shù)傳遞呢。可以, 不過需要定義一個更高階的函數(shù), 也就是外面還要套一層函數(shù), 比如, 我還要輸出我的自定義的一個信息,需要傳遞參數(shù)

def c_info(text):  def my_info(func):    def wrapper(*args, **params):      print text      print 218      return func(*args, **params)    return wrapper  return my_info #使用裝飾器 @c_info("Tony") def my_name():  print "Yi_Zhi_Yu" my_name() #Tony #218 #Yi_Zhi_Yu

與前面的那個裝飾器相比, 僅僅是多了個外層, 內(nèi)層也僅僅是增加了對外層傳入?yún)?shù)(text)的調(diào)用

總而言之, Python在函數(shù)定義中支持了對oop思想中的裝飾器的實現(xiàn), 其本質(zhì)也只是使用了閉包的思路, 延遲調(diào)用, 并在調(diào)用前后增加自己的其他實現(xiàn)內(nèi)容

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 崇阳县| 台山市| 德化县| 双柏县| 精河县| 阳朔县| 卓尼县| 墨江| 屏南县| 资阳市| 建湖县| 余江县| 左云县| 惠州市| 武川县| 海丰县| 集贤县| 万全县| 湛江市| 福州市| 沧源| 虎林市| 肇庆市| 黔西县| 凤城市| 西安市| 米易县| 黑山县| 安新县| 桂平市| 龙州县| 贵德县| 昌宁县| 扬州市| 保靖县| 巨野县| 宁阳县| 吉水县| 亚东县| 大埔县| 洛川县|