摘要:一引用書流暢的書二基本概念問題裝飾器是什么解答嚴(yán)格來說,裝飾器只是語法糖,裝飾器是可調(diào)用的對(duì)象,可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,特殊的地方是裝飾器的參數(shù)是一個(gè)函數(shù)問題裝飾器有什么特性解答裝飾器有個(gè)特性,一是可以把被裝飾的函數(shù)替換成其他函數(shù),
一, 引用
[書] 流暢的Python
[書] Effective Python
問題1:裝飾器是什么?
解答: 嚴(yán)格來說,裝飾器只是語法糖, 裝飾器是可調(diào)用的對(duì)象,可以像常規(guī)的可調(diào)用對(duì)象那樣調(diào)用,特殊的地方是裝飾器的參數(shù)是一個(gè)函數(shù)
問題2:裝飾器有什么特性?
解答: 裝飾器有2個(gè)特性,一是可以把被裝飾的函數(shù)替換成其他函數(shù), 二是可以在加載模塊時(shí)候立即執(zhí)行
def decorate(func): print("running decorate", func) def decorate_inner(): print("running decorate_inner function") return func() return decorate_inner @decorate def func_1(): print("running func_1") if __name__ == "__main__": print(func_1) #返回值 running decorate.decorate_inner at 0x7f29f641cb70>
問題3:如何使用被裝飾函數(shù)中的參數(shù)?
解答: 通過args 和 *kwargs 傳遞被修飾函數(shù)中的參數(shù)
def decorate(func): def decorate_inner(*args, **kwargs): print(type(args), type(kwargs)) print("args", args, "kwargs", kwargs) return func(*args, **kwargs) return decorate_inner @decorate def func_1(*args, **kwargs): print(args, kwargs) if __name__ == "__main__": func_1("1", "2", "3", para_1="1", para_2="2", para_3="3") #返回值args ("1", "2", "3") kwargs {"para_2": "2", "para_1": "1", "para_3": "3"} ("1", "2", "3") {"para_2": "2", "para_1": "1", "para_3": "3"}
問題1:疊放裝飾器執(zhí)行順序是什么?
解答: 如果一個(gè)函數(shù)被多個(gè)裝飾器修飾,其實(shí)應(yīng)該是該函數(shù)先被最里面的裝飾器修飾后(下面例子中函數(shù)main()先被inner裝飾,變成新的函數(shù)),變成另一個(gè)函數(shù)后,再次被裝飾器修飾
def outer(func): print("enter outer", func) def wrapper(): print("running outer") func() return wrapper def inner(func): print("enter inner", func) def wrapper(): print("running inner") func() return wrapper @outer @inner def main(): print("running main") if __name__ == "__main__": main() #返回值 enter innerenter outer .wrapper at 0x7fa1c96e8bf8> running outer running inner running main
問題1: 標(biāo)準(zhǔn)庫中都有哪些裝飾器?
解答: 標(biāo)準(zhǔn)庫中有多種裝飾器, 例如:裝飾方法的函數(shù)有property, classmethod, staticmethod; functools模塊中的lru_cache,?singledispatch, ?wraps 等等
from functools import lru_cache from functools import singledispatch from functools import wraps
問題2:為什么要使用@wraps裝飾器?它的作用是什么?
解答: 使用裝飾器會(huì)產(chǎn)生我們可能不希望出現(xiàn)的副作用, 例如:改變被修飾函數(shù)名稱,對(duì)于調(diào)試器或者對(duì)象序列化器等需要使用內(nèi)省機(jī)制的那些工具,可能會(huì)無法正常運(yùn)行;其實(shí)調(diào)用裝飾器后,會(huì)將同一個(gè)作用域中原來函數(shù)同名的那個(gè)變量(例如下面的func_1),重新賦值為裝飾器返回的對(duì)象;使用@wraps后,會(huì)把與內(nèi)部函數(shù)(被修飾函數(shù),例如下面的func_1)相關(guān)的重要元數(shù)據(jù)全部復(fù)制到外圍函數(shù)(例如下面的decorate_inner)
from functools import wraps def decorate(func): print("running decorate", func) @wraps(func) def decorate_inner(): print("running decorate_inner function", decorate_inner) return func() return decorate_inner @decorate def func_1(): print("running func_1", func_1) if __name__ == "__main__": func_1() #返回值 running decoraterunning decorate_inner function running func_1
問題1: 什么是裝飾器設(shè)計(jì)模式?
解答: 動(dòng)態(tài)的給一個(gè)對(duì)象添加一些額外的職責(zé),就擴(kuò)展功能而言,裝飾器模式比子類化更加靈活,在設(shè)計(jì)模式中,裝飾器和組件都是抽象類,為了給具體的組件添加行為,具體的裝飾器實(shí)例要包裝具體組件的實(shí)例,即,裝飾器和所裝飾的組件接口一致,對(duì)使用該組建的客戶透明,將客戶的請(qǐng)求轉(zhuǎn)發(fā)給該組件,并且可能在轉(zhuǎn)發(fā)前后執(zhí)行一些額外的操作,透明性使得可以遞歸嵌套多個(gè)裝飾器,從而可以添加任意多個(gè)功能
問題2: Python中的裝飾器函數(shù)和設(shè)計(jì)模式中的裝飾器模式有什么關(guān)系?
解答: 修飾器模式和Python修飾器之間并不是一對(duì)一的等價(jià)關(guān)系, Python裝飾器函數(shù)更為強(qiáng)大,不僅僅可以實(shí)現(xiàn)裝飾器模式。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/40774.html
摘要:裝飾器的使用符合了面向?qū)ο缶幊痰拈_放封閉原則。三簡(jiǎn)單的裝飾器基于上面的函數(shù)執(zhí)行時(shí)間的需求,我們就手寫一個(gè)簡(jiǎn)單的裝飾器進(jìn)行實(shí)現(xiàn)。函數(shù)體就是要實(shí)現(xiàn)裝飾器的內(nèi)容。類裝飾器的實(shí)現(xiàn)是調(diào)用了類里面的函數(shù)。類裝飾器的寫法比我們裝飾器函數(shù)的寫法更加簡(jiǎn)單。 目錄 前言 一、什么是裝飾器 二、為什么要用裝飾器 ...
摘要:希望引以為戒鄭傳裝飾模式如果你了解,你肯定聽過裝飾器模式。在面向?qū)ο笾校b飾模式指動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加一些功能來說,裝飾模式比生成子類更為靈活。 漫談 如果作為一個(gè)Python入門,不了解Python裝飾器也沒什么,但是如果作為一個(gè)中級(jí)Python開發(fā)人員,如果再不對(duì)python裝飾器熟稔于心的話,那么可能并沒有量變積累到質(zhì)變。 我以前也看過很多講python 裝...
摘要:一般情況下,我們使用裝飾器提供的語法糖,來簡(jiǎn)化上面的寫法像上面的情況,可以動(dòng)態(tài)修改函數(shù)或類功能的函數(shù)就是裝飾器。本文標(biāo)題為會(huì)打扮的裝飾器本文鏈接為參考資料修飾器的函數(shù)式編程中的裝飾器介紹思誠之道裝飾器入門與提高賴明星 裝飾器 我們知道,在 Python 中,我們可以像使用變量一樣使用函數(shù): 函數(shù)可以被賦值給其他變量 函數(shù)可以被刪除 可以在函數(shù)里面再定義函數(shù) 函數(shù)可以作為參數(shù)傳遞給另外...
摘要:初步認(rèn)識(shí)裝飾器函數(shù)裝飾器用于在源代碼中標(biāo)記函數(shù),以某種方式增強(qiáng)函數(shù)的行為。函數(shù)裝飾器在導(dǎo)入模塊時(shí)立即執(zhí)行,而被裝飾的函數(shù)只在明確調(diào)用時(shí)運(yùn)行。只有涉及嵌套函數(shù)時(shí)才有閉包問題。如果想保留函數(shù)原本的屬性,可以使用標(biāo)準(zhǔn)庫中的裝飾器。 《流暢的Python》筆記本篇將從最簡(jiǎn)單的裝飾器開始,逐漸深入到閉包的概念,然后實(shí)現(xiàn)參數(shù)化裝飾器,最后介紹標(biāo)準(zhǔn)庫中常用的裝飾器。 1. 初步認(rèn)識(shí)裝飾器 函數(shù)裝飾...
摘要:變量查找規(guī)則在中一個(gè)變量的查找順序是局部環(huán)境,閉包,全局,內(nèi)建閉包引用了自由變量的函數(shù)。閉包的作用閉包的最大特點(diǎn)是可以將父函數(shù)的變量與內(nèi)部函數(shù)綁定,并返回綁定變量后的函數(shù),此時(shí)即便生成閉包的環(huán)境父函數(shù)已經(jīng)釋放,閉包仍然存在。 導(dǎo)語:本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之函數(shù)篇的重點(diǎn)知識(shí)及個(gè)人心得,打算入門Python的朋友們可以來一起學(xué)習(xí)并交流。 本文重點(diǎn): 1、掌握裝飾器的本質(zhì)、功...
閱讀 2812·2021-11-24 09:39
閱讀 3381·2021-11-19 09:40
閱讀 2253·2021-11-17 09:33
閱讀 3744·2021-10-08 10:04
閱讀 3035·2021-09-26 09:55
閱讀 1656·2021-09-22 15:26
閱讀 919·2021-09-10 10:51
閱讀 3116·2019-08-30 15:44