最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python語法詳解之decorator裝飾器

 更新時間:2021年10月21日 10:24:50   作者:GlassySky0816  
裝飾器 decorator 或者稱為包裝器,是對函數(shù)的一種包裝,今天通過本文給大家分享Python語法詳解之decorator裝飾器的相關知識,感興趣的朋友一起看看吧

python 是一門優(yōu)雅的語言,有些使用方法就像魔法一樣。裝飾器(decorator)就是一種化腐朽性為神奇的技巧。最近一直都在使用 Tornado 框架,一直還是念念不忘 Flask 。Flask 是我最喜歡的 Python 框架,最早被它吸引也是源自它使用裝飾器這個語法糖(Syntactic sugar)來做 Router,讓代碼看上去就感覺甜甜的。

Tornado 中的 Router 略顯平淡,懷念 Flask 的味道,于是很好奇的想知道 Flask 是如何使用這個魔法。通過閱讀 Flask 的源碼,我們也可以為 Tornado 實現(xiàn)了一個裝飾器 Router。

當然對于剛接觸 Python 的人,也許很容易理解裝飾器本質(zhì)是設計模式中的裝飾器模式。可是 Python 通過@一個實現(xiàn)裝飾器的語法糖。下面看下Python語法詳解之decorator裝飾器。

一、定義

裝飾器 decorator 或者稱為包裝器,是對函數(shù)的一種包裝。

二、作用

它能使函數(shù)的功能得到擴充,而同時不用修改函數(shù)本身的代碼。它能夠增加函數(shù)執(zhí)行前、執(zhí)行后的行為,而不需對調(diào)用函數(shù)的代碼做任何改變。

三、舉例

初始化函數(shù)

# 函數(shù)hello,輸出 hello + name 的字符串 
def hello(name):
    return 'hello ' + name  

希望實現(xiàn)功能:在每一個調(diào)用 hello 函數(shù)的時候,將輸出的字符串用 <tag>包住

例如:hello john 變成 <tag>hello john<tag>

方法一:自定義wrapper函數(shù)

這種方法成功修改了函數(shù) hello 的行為,不過需要修改對 hello的調(diào)用。

每一個調(diào)用hello 的地方,都要給成調(diào)用wrapper,并修改參數(shù)列表

def hello(name):
    return 'hello ' + name
 
def wrapper(tag, func, *arg, **kvargs):
    tag = "<" + tag + ">"
    return tag + func(*arg, **kvargs) + tag
 
if __name__ == "__main__":
    print(wrapper('p', hello, 'john'))

輸出

方法二:自定義decorator函數(shù)

為了不改變對 hello的調(diào)用。我們需要得到一個新的函數(shù)對象,它修改 hello的行為,并用這個對象對 hello賦值。

從而調(diào)用 hello的時候,調(diào)用的是擴充行為后的 hello

def hello(name):
    return 'hello ' + name
def myDecorator(func, tag):
    def myWrapper(*arg, **kvargs):  # 重新包裝func,其參數(shù)列表與func一致
        sign = "<" + tag + ">"
        return sign + func(*arg, **kvargs) + sign
 
    return myWrapper
 
hello = myDecorator(hello, "div")  # 用新的函數(shù)對象修改hello
 
if __name__ == "__main__":
    print(hello("john")) 

 這樣,只要hello被myDecorator 賦值一次,以后再調(diào)用hello 時,就調(diào)用的是包裝后的函數(shù)

輸出

方法三:python的decorator

python 的裝飾器所做的事與方式2類似

它通過語法糖使裝飾器看起來更清晰、簡介,而不用每次都書寫方式2中第7行代碼 hello = myDecorator(hello, "div")

def setTag(tag):  # 由于此裝飾器需要參數(shù),所以要再套一層
    def myDecorator(func):  # 裝飾器的核心,接受函數(shù)對象做參數(shù),返回包裝后的函數(shù)對象
        def myWrapper(*arg, **kvargs):  # 包裝的具體過程
            sign = "<" + tag + ">"
            return sign + func(*arg, **kvargs) + sign
 
        return myWrapper
 
    return myDecorator
 
 
@setTag("div")  # 用@標簽在定義函數(shù)時套上裝飾器
def hello(name):
    return 'hello' + name
 
 
if __name__ == '__main__':
    print(hello('john'))

本質(zhì)上,方式2 與 方式3 完成的是同一件事,只不過方式3 比方式2 代碼更簡潔,方便。

比如,現(xiàn)在要給 hello 函數(shù)套上三個標簽<body><div><p>

如果用方式2

hello = myDecorator(myDecorator(myDecorator(hello, "body"),"div"),"p")

如果用方式3

@myDecorator("body")
@myDecorator("div")
@myDecorator("p")
def hello(name)
    return 'hello' + name

在多個裝飾器嵌套的情況下,python內(nèi)置的decorator 結構更清晰。

偽代碼:

def myDecorator(...):    #定義裝飾器,可能帶參數(shù)
    def decorator(func):    #裝飾器核心,以被裝飾的函數(shù)對象為參數(shù),返回裝飾后的函數(shù)對象
        def wrapper(*args, **kvargs):    #裝飾的過程,參數(shù)列表適應不同參數(shù)的函數(shù)
             ...    #修改函數(shù)調(diào)用前的行為
             func(*args, **kvargs)    #調(diào)用函數(shù)
             ...    #修改函數(shù)調(diào)用后的行為
         return wrapper
     return decorator
 
@myDecorator(...):    #給函數(shù)加上裝飾器
def myFunc(...):      #自己定義的功能函數(shù)
    ...

知識點:

  • 在python中,當*和**符號出現(xiàn)在函數(shù)定義的參數(shù)中時,表示任意數(shù)目參數(shù)收集。*arg表示任意多個無名參數(shù),類型為tuple;**kwargs表示關鍵字參數(shù),為dict,使用時需將*arg放在**kwargs之前,否則會有“SyntaxError: non-keyword arg after keyword arg”的語法錯誤
  • 在函數(shù)調(diào)用時,*會以單個元素的形式解包一個元祖,使其成為獨立的參數(shù)。
  • 在函數(shù)調(diào)用時,**會以鍵/值對的形式解包一個字典,使其成為獨立的關鍵字參數(shù)。

到此這篇關于Python語法:decorator裝飾器的文章就介紹到這了,更多相關Python decorator裝飾器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python字符串格式化%s%d%f詳解

    Python字符串格式化%s%d%f詳解

    這篇文章主要介紹了Python字符串格式化%s%d%f詳解,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Tensorflow tf.nn.depthwise_conv2d如何實現(xiàn)深度卷積的

    Tensorflow tf.nn.depthwise_conv2d如何實現(xiàn)深度卷積的

    這篇文章主要介紹了Tensorflow tf.nn.depthwise_conv2d如何實現(xiàn)深度卷積的,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • Opencv-Python圖像透視變換cv2.warpPerspective的示例

    Opencv-Python圖像透視變換cv2.warpPerspective的示例

    今天小編就為大家分享一篇關于Opencv-Python圖像透視變換cv2.warpPerspective的示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 一分鐘帶你掌握Python中pip的安裝與使用方法

    一分鐘帶你掌握Python中pip的安裝與使用方法

    pip是什么?它是Python包管理工具,這個工具提供了對Python 包的查找、下載、安裝和卸載的功能,這篇文章主要介紹了pip的安裝與使用方法
    2021-08-08
  • Python常用標準庫詳解(pickle序列化和JSON序列化)

    Python常用標準庫詳解(pickle序列化和JSON序列化)

    這篇文章主要介紹了Python常用標準庫,主要包括pickle序列化和JSON序列化模塊,通過使用場景分析給大家介紹的非常詳細,需要的朋友可以參考下
    2022-05-05
  • windows下python安裝pip方法詳解

    windows下python安裝pip方法詳解

    這篇文章主要介紹了windows下python安裝pip方法詳解,需要的朋友可以參考下
    2020-02-02
  • Python if語句知識點用法總結

    Python if語句知識點用法總結

    本篇文章給python初學者總結了關于Python之if語句的相關用法以及知識點總結,跟著學習下吧。
    2018-06-06
  • python中的進度條工具tqdm及用法示例

    python中的進度條工具tqdm及用法示例

    tqdm 是 Python 中一個非常流行的進度條工具,常用于長時間運行的任務,如數(shù)據(jù)處理、訓練機器學習模型等,下面是 tqdm 的詳細介紹及一些常見用法示例,感興趣的朋友一起看看吧
    2024-06-06
  • 詳解python的網(wǎng)絡編程基礎

    詳解python的網(wǎng)絡編程基礎

    這篇文章主要為大家介紹了python網(wǎng)絡編程的基礎,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • 通過實例淺析Python對比C語言的編程思想差異

    通過實例淺析Python對比C語言的編程思想差異

    這篇文章主要介紹了通過實例淺析Python對比C語言的編程思想差異,作為面向?qū)ο蠛兔嫦蜻^程的編程語言代表,二者的對比可謂經(jīng)典,需要的朋友可以參考下
    2015-08-08

最新評論

伊吾县| 左贡县| 苏尼特左旗| 张家口市| 扎赉特旗| 进贤县| 南部县| 南昌市| 错那县| 清徐县| 崇阳县| 长泰县| 常山县| 通道| 岑巩县| 章丘市| 沛县| 革吉县| 五大连池市| 余姚市| 德安县| 正镶白旗| 黔西县| 崇信县| 临潭县| 永宁县| 宣武区| 哈尔滨市| 上饶县| 莫力| 互助| 张家港市| 嫩江县| 奇台县| 工布江达县| 澄迈县| 安乡县| 大关县| 襄垣县| 辽源市| 五常市|