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

如何真正的了解python裝飾器

 更新時(shí)間:2020年08月14日 08:20:26   作者:FXL  
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于如何真正的了解python裝飾器的相關(guān)文章,需要的朋友們可以參考下。

合理使用裝飾器可以簡(jiǎn)化開(kāi)發(fā),并且使得代碼更加清晰。下面我們分別介紹兩種裝飾器,不帶參數(shù)的裝飾器和帶參數(shù)的裝飾器。

一、不帶參數(shù)的裝飾器

我們用一個(gè)實(shí)際的例子來(lái)引入裝飾器的概念,比如我們現(xiàn)在有一個(gè)方法A(),然后我們需要在方法A()執(zhí)行之前在終端打印"function is running",這時(shí)候我們可以在方法A()的開(kāi)始部分加上下面的代碼:

print("function is running")

但是如果我們不想修改方法A()的代碼,也可以重新寫(xiě)一個(gè)方法decorator(),然后把A()作為入?yún)?,代碼如下:

def decorator(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        print("Method is running")
        return fun()
    return wrapper

python中的方法可以作為參數(shù)傳入另一個(gè)方法,所以當(dāng)我們執(zhí)行decorator(A)的時(shí)候,返回的是一個(gè)方法,這個(gè)方法的本質(zhì)是先執(zhí)行print語(yǔ)句,然后再執(zhí)行A()。

但是這樣我們的調(diào)用代碼就需要進(jìn)行修改,也就是說(shuō)之前調(diào)用方法A(),現(xiàn)在的寫(xiě)法是調(diào)用decorator(A)(),為了不影響調(diào)用的代碼,我們使用python的語(yǔ)法糖改造方法A()的代碼。

@decorator
def A():
    # do something

實(shí)際上只是在A()的前面加上一行@decorator,這樣在我們的調(diào)用代碼就不需要改變了。

裝飾器中的@functools.wraps(fun)是為了保證返回的方法__name__屬性和入?yún)⒎椒╢un的__name__屬性相同。

二、帶入?yún)⒌难b飾器

在上面不帶參數(shù)的裝飾器中,我們實(shí)現(xiàn)了在執(zhí)行方法A()之前打印一行固定的字符串,如果我們想要打印不同的字符串就需要用帶參數(shù)的裝飾器。實(shí)際上就是在不帶參數(shù)的裝飾器上再封裝一層即可,代碼如下:

def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator

這樣我們就可以在使用裝飾器的時(shí)候設(shè)置參數(shù)name,實(shí)現(xiàn)打印不同的信息。完整的代碼如下:

import functools
 
def decorator_par(name):
    def decorator(fun):
        @functools.wraps(fun)
        def wrapper(*args, **kwargs):
            print("Method {} is running".format(name))
            return fun()
        return wrapper
    return decorator
 
@decorator_par("A")
def A():
    print("I am A")
 
@decorator_par("B")
def B():
    print("I am B")
 
A()
B()

執(zhí)行輸出為:

Method A is running
I am A
Method B is running
I am B

可以看到我們?cè)诓桓淖兎椒ㄕ{(diào)用代碼的情況下,實(shí)現(xiàn)了在該方法之前打印特定的信息。

以上就是裝飾器的兩種實(shí)現(xiàn)示例,實(shí)際開(kāi)發(fā)中也可以將多個(gè)裝飾器進(jìn)行嵌套,可以實(shí)現(xiàn)更加復(fù)雜的需求。

內(nèi)容擴(kuò)展:

python函數(shù)式編程之裝飾器

1.開(kāi)放封閉原則

簡(jiǎn)單來(lái)說(shuō),就是對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉。

在面向?qū)ο蟮木幊谭绞街?,?jīng)常會(huì)定義各種函數(shù)。一個(gè)函數(shù)的使用分為定義階段和使用階段,一個(gè)函數(shù)定義完成以后,可能會(huì)在很多位置被調(diào)用。這意味著如果函數(shù)的定義階段代碼被修改,受到影響的地方就會(huì)有很多,此時(shí)很容易因?yàn)橐粋€(gè)小地方的修改而影響整套系統(tǒng)的崩潰,所以對(duì)于現(xiàn)代程序開(kāi)發(fā)行業(yè)來(lái)說(shuō),一套系統(tǒng)一旦上線,系統(tǒng)的源代碼就一定不能夠再改動(dòng)了。然而一套系統(tǒng)上線以后,隨著用戶數(shù)量的不斷增加,一定會(huì)為一套系統(tǒng)擴(kuò)展添加新的功能。

此時(shí),又不能修改原有系統(tǒng)的源代碼,又要為原有系統(tǒng)開(kāi)發(fā)增加新功能,這就是程序開(kāi)發(fā)行業(yè)的開(kāi)放封閉原則,這時(shí)就要用到裝飾器了。

2.什么是裝飾器

裝飾器,顧名思義,就是裝飾,修飾別的對(duì)象的一種工具。

所以裝飾器可以是任意可調(diào)用的對(duì)象,被裝飾的對(duì)象也可以是任意可調(diào)用對(duì)象。

3.裝飾器的作用

在不修改被裝飾對(duì)象的源代碼以及調(diào)用方式的前提下為被裝飾對(duì)象添加新功能。

以上就是如何真正的了解python裝飾器的詳細(xì)內(nèi)容,更多關(guān)于你真的了解python裝飾器么的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pytorch根據(jù)layers的name凍結(jié)訓(xùn)練方式

    Pytorch根據(jù)layers的name凍結(jié)訓(xùn)練方式

    今天小編就為大家分享一篇Pytorch根據(jù)layers的name凍結(jié)訓(xùn)練方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • Object arrays cannot be loaded when allow_pickle=False的問(wèn)題

    Object arrays cannot be loaded when

    這篇文章主要介紹了Object arrays cannot be loaded when allow_pickle=False,本文給大家分享問(wèn)題解決思路,需要的朋友可以參考下
    2022-11-11
  • python如何繪制登陸時(shí)的衛(wèi)星云圖(TBB)

    python如何繪制登陸時(shí)的衛(wèi)星云圖(TBB)

    這篇文章主要介紹了python如何繪制登陸時(shí)的衛(wèi)星云圖(TBB),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • wxpython 學(xué)習(xí)筆記 第一天

    wxpython 學(xué)習(xí)筆記 第一天

    wxPython是Python編程語(yǔ)言的一個(gè)GUI工具箱。他使得Python程序員能夠輕松的創(chuàng)建具有健壯、功能強(qiáng)大的圖形用戶界面的程序。
    2009-02-02
  • Python GUI之tkinter詳解

    Python GUI之tkinter詳解

    今天帶大家學(xué)習(xí)Python GUI之tkinter的相關(guān)知識(shí),文中對(duì)如何使用tkinter作了非常詳細(xì)的介紹及代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-10-10
  • Python繪制二維曲線的日常應(yīng)用詳解

    Python繪制二維曲線的日常應(yīng)用詳解

    今天小編就為大家分享一篇Python繪制二維曲線的日常應(yīng)用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Pytorch Tensor的索引與切片例子

    Pytorch Tensor的索引與切片例子

    今天小編就為大家分享一篇Pytorch Tensor的索引與切片例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次)

    python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次)

    下面小編就為大家分享一篇python裝飾器-限制函數(shù)調(diào)用次數(shù)的方法(10s調(diào)用一次),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-04-04
  • django orm 通過(guò)related_name反向查詢的方法

    django orm 通過(guò)related_name反向查詢的方法

    今天小編就為大家分享一篇django orm 通過(guò)related_name反向查詢的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Python實(shí)現(xiàn)讀取Excel文件并復(fù)制指定的數(shù)據(jù)行

    Python實(shí)現(xiàn)讀取Excel文件并復(fù)制指定的數(shù)據(jù)行

    這篇文章主要介紹了如何基于Python語(yǔ)言,讀取Excel表格文件數(shù)據(jù),并基于其中某一列數(shù)據(jù)的值,將這一數(shù)據(jù)處于指定范圍的那一行加以復(fù)制,感興趣的可以了解一下
    2023-07-07

最新評(píng)論

图们市| 灵宝市| 汪清县| 平定县| 香港| 荣昌县| 湖南省| 榆林市| 墨江| 秀山| 马边| 武冈市| 房产| 丁青县| 灵璧县| 香港 | 安吉县| 冀州市| 临洮县| 安顺市| 德清县| 册亨县| 鄂伦春自治旗| 房产| 义乌市| 西峡县| 娱乐| 武安市| 永定县| 德令哈市| 凭祥市| 山西省| 东宁县| 峡江县| 光山县| 揭东县| 积石山| 济阳县| 松阳县| 延长县| 外汇|