摘要:前言最近跟著流暢的和學(xué)習(xí),看到裝飾器部分,有些頭大倒不是因?yàn)楦拍铍y以理解,而是書和網(wǎng)上文章中有些地方有些矛盾之處在簡(jiǎn)單學(xué)習(xí)和實(shí)踐之后,整理出我對(duì)裝飾器的理解如下裝飾器的定義在不同語境下,裝飾器有不一樣的含義,我大致認(rèn)為有種定義一種把另一個(gè)對(duì)
前言
最近跟著《流暢的Python》和《Python Cookbook》學(xué)習(xí),看到裝飾器部分,有些頭大
倒不是因?yàn)楦拍铍y以理解,而是書和網(wǎng)上文章中有些地方有些矛盾之處
在簡(jiǎn)單學(xué)習(xí)和實(shí)踐之后,整理出我對(duì)裝飾器的理解如下
在不同語境下,裝飾器有不一樣的含義,我大致認(rèn)為有3種定義:
一種把另一個(gè)對(duì)象當(dāng)參數(shù)的對(duì)象
一種語法糖
面對(duì)對(duì)象設(shè)計(jì)中的裝飾器模式
之所以這里特別指出,是因?yàn)樵诤芏辔恼潞蜁?br>把裝飾器定義成一個(gè)函數(shù),有些更擴(kuò)展一些,把裝飾器定義成一個(gè)callable對(duì)象
對(duì)剛開始學(xué)習(xí)的讀者來說這么解釋或許不錯(cuò),但在使用python的過程中,我們發(fā)現(xiàn)裝飾器可以是
函數(shù)
類 (例: classmethod和property)
實(shí)例方法 (例: FLask類的實(shí)例app的route方法)
類方法
如果說方法有__call__方法,能符合上面callable對(duì)象的定義的話
classmethod類和property類可沒__call__方法,所以我認(rèn)為更準(zhǔn)確的定義是我上面總結(jié)的前兩點(diǎn)
廣義上說,更優(yōu)雅地處理對(duì)象,相比taget = decorate(target),@decorate可要優(yōu)雅多了
狹義上說,各種功能:
禁止函數(shù)運(yùn)行 (剛想到,寫個(gè)不return原函數(shù)的裝飾器去裝飾某函數(shù),這個(gè)函數(shù)不就不運(yùn)行了嘛,不曉得是否有人會(huì)這么干)
記錄函數(shù)的運(yùn)行狀況
緩存計(jì)算結(jié)果
檢查/修改參數(shù)
裝逼?
其他
裝飾器的使用注意點(diǎn)使用多個(gè)裝飾器時(shí)的運(yùn)行順序;最外圍/上面的裝飾器最晚生效;特別當(dāng)裝飾器返回一個(gè)和原先不同類型的對(duì)象(比如classmethod)時(shí),更要小心
記得用functools中的wraps保留被裝飾對(duì)象的屬性
其他(還沒想到)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/41033.html
摘要:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的裝飾器輸出被裝飾函數(shù)的運(yùn)行時(shí)間簡(jiǎn)單運(yùn)用運(yùn)行結(jié)果運(yùn)行過程中,首先輸出裝飾器函數(shù)中的內(nèi)容被裝飾函數(shù)運(yùn)行時(shí)間長(zhǎng)度函數(shù)名稱和實(shí)際參數(shù)計(jì)算結(jié)果然后得到最終的計(jì)算結(jié)果。 函數(shù)裝飾器 函數(shù)裝飾器用于在源碼中標(biāo)記函數(shù), 以某種方式增強(qiáng)函數(shù)的行為,這是一個(gè)強(qiáng)大的功能。 函數(shù)裝飾器是一個(gè)可調(diào)用對(duì)象,其參數(shù)是另外一個(gè)函數(shù),即被裝飾函數(shù)。裝飾器可能處理被裝飾函數(shù),然后將其返回,或者將其替換成另一...
摘要:裝飾器介紹中的裝飾器的目的是為一個(gè)目標(biāo)函數(shù)添加額外的功能卻不修改函數(shù)本身。裝飾器的本身其實(shí)是一個(gè)特殊的函數(shù)。那么有啥更好的解決方式呢裝飾器代碼像上面這么寫,可以較好地解決了上面提到的第一個(gè)問題。裝飾器語法糖放在函數(shù)前面,相當(dāng)于執(zhí)行了等。 怎么理解python中的裝飾器 一個(gè)比喻 知乎上有一個(gè)比較形象的比喻 https://www.zhihu.com/questio...:人類穿著內(nèi)褲很...
摘要:設(shè)計(jì)模式學(xué)習(xí)裝飾器模式這個(gè)在我的筆記中有介紹工廠模式未完成,待更新單例模式保證一個(gè)對(duì)象最多只有一個(gè)實(shí)例存在。對(duì)安全性要求較高的場(chǎng)景,比如銀行的修改余額業(yè)務(wù)。如果我們不使用單例模式,那么就會(huì)創(chuàng)建三個(gè)不同的實(shí)例。 設(shè)計(jì)模式學(xué)習(xí) 1.裝飾器模式 這個(gè)在我的筆記中有介紹 2.工廠模式 author : liibntime :2018-11-6未完成,待更新 3.單例模式 保證一個(gè)對(duì)象最多只有一...
摘要:的裝飾器可以實(shí)現(xiàn)在代碼運(yùn)行期間修改函數(shù)的上下文,即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作,而函數(shù)本身并沒有任何的改變。中的參數(shù),實(shí)際上則是傳遞給實(shí)際上是的參數(shù)因?yàn)檠b飾器也是個(gè)函數(shù),那么裝飾器自己的能不能有參數(shù)傳遞呢。 Python的裝飾器可以實(shí)現(xiàn)在代碼運(yùn)行期間修改函數(shù)的上下文, 即可以定義函數(shù)在執(zhí)行之前進(jìn)行何種操作和函數(shù)執(zhí)行后進(jìn)行何種操作, 而函數(shù)本身并沒有任何的改...
摘要:最近看前端都展開了幾場(chǎng)而我大知乎最熱語言還沒有相關(guān)。有關(guān)書籍的介紹,大部分截取自是官方介紹。但從開始,標(biāo)準(zhǔn)庫為我們提供了模塊,它提供了和兩個(gè)類,實(shí)現(xiàn)了對(duì)和的進(jìn)一步抽象,對(duì)編寫線程池進(jìn)程池提供了直接的支持。 《流暢的python》閱讀筆記 《流暢的python》是一本適合python進(jìn)階的書, 里面介紹的基本都是高級(jí)的python用法. 對(duì)于初學(xué)python的人來說, 基礎(chǔ)大概也就夠用了...
閱讀 924·2021-11-25 09:43
閱讀 1298·2021-11-17 09:33
閱讀 3014·2019-08-30 15:44
閱讀 3313·2019-08-29 17:16
閱讀 484·2019-08-28 18:20
閱讀 1641·2019-08-26 13:54
閱讀 556·2019-08-26 12:14
閱讀 2176·2019-08-26 12:14