中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

函數(shù)裝飾器和類裝飾器的使用方法

這篇文章主要為大家詳細(xì)介紹了函數(shù)裝飾器和類裝飾器的使用方法,文中示例代碼介紹的非常詳細(xì),零基礎(chǔ)也能參考此文章,感興趣的小伙伴們可以參考一下。

創(chuàng)新新互聯(lián),憑借10多年的網(wǎng)站設(shè)計、網(wǎng)站建設(shè)經(jīng)驗,本著真心·誠心服務(wù)的企業(yè)理念服務(wù)于成都中小企業(yè)設(shè)計網(wǎng)站有1000多家案例。做網(wǎng)站建設(shè),選創(chuàng)新互聯(lián)。

函數(shù)裝飾器實現(xiàn)

裝飾器算是類里面比較難的內(nèi)容之一,但是實際上它的思想并不復(fù)雜。簡單點說,就是在你原來內(nèi)容的基礎(chǔ)上,在外面給你加點東西,實現(xiàn)類似裝飾的效果。但是它是怎么實現(xiàn)的呢?一般來說,都是通過攔截函數(shù)調(diào)用來實現(xiàn)的,比如:用裝飾器裝飾函數(shù)的時候,它攔截函數(shù)調(diào)用,裝飾類的時候,它攔截類實例的創(chuàng)建調(diào)用,即攔截類初始化__init__函數(shù)。
知道這個原理以后,我們就可以來嘗試實現(xiàn)了。

首先來看通過函數(shù)裝飾器攔截類的創(chuàng)建過程,代碼如下:

instance = {}
def createInstance(cls, *args):
    if cls not in instance:
        instance[cls] = cls(*args)
    return instance[cls]

def singleIns(cls):
    def onCall(*args):
        return createInstance(cls, *args)
    return onCall

上面就是這個函數(shù)裝飾器singleIns的實現(xiàn),它返回一個函數(shù)調(diào)用,當(dāng)用它來裝飾一個類,創(chuàng)建類實例的時候,就會用onCall方法攔截類的__init__方法。我們再來看一下它怎么使用的。

@singleIns
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return "{} 的年齡是{}".format(self.name, self.age)
zhangsan = Person('zhangsan', 30)
lisi = Person('lisi', 29)
print(zhangsan)
print(lisi)

最終的輸出結(jié)果是:

zhangsan 的年齡是30
zhangsan 的年齡是30

為什么結(jié)果是一樣的?因為在創(chuàng)建實例的過程中,__init__函數(shù)被onCall函數(shù)攔截,此時會進(jìn)入到createInstance函數(shù)的流程中,會對這個類實例進(jìn)行判斷,如果不存在這個類的實例,那么就初始化一個后返回,如果存在,直接返回第一個創(chuàng)建的類實例。因此最終只有一個類實例存在,就實現(xiàn)類單例類。

類裝飾器實現(xiàn)

上面最開始的位置我們說了,函數(shù)裝飾器和類裝飾器都是攔截函數(shù)調(diào)用,在函數(shù)裝飾器實現(xiàn)類調(diào)用攔截的地方我們看到,它是通過函數(shù)裝飾器內(nèi)部的函數(shù)來實現(xiàn)攔截的。如果是類裝飾器呢,它通過什么來攔截呢?
答案是call函數(shù)來攔截,我們來看一下類裝飾器的實現(xiàn)代碼:

class singleIns:
    def __init__(self, cls):
        self.cls = cls
        self.ins = None
    def __call__(self, *args):
        if self.ins is None:
            self.ins = self.cls(*args)
        return self.ins

代碼和函數(shù)裝飾器相比,其實功能沒有太多變化,通過__call__方法來接收被攔截類的初始化函數(shù)參數(shù)args,然后用args來初始化類實例。但是只在這個類還沒有實例的情況下進(jìn)行初始化,否則直接返會初始化好的類。
我們來看一下應(yīng)用的代碼:

@singleIns
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return "{} 的年齡是{}".format(self.name, self.age)
zhangsan = Person('zhangsan', 30)
lisi = Person('lisi', 29)
print(zhangsan)
print(lisi)

最終的結(jié)果和上面函數(shù)裝飾器的一樣,如下所示:

zhangsan 的年齡是30
zhangsan 的年齡是30

看完上述內(nèi)容,你們對函數(shù)裝飾器和類裝飾器的使用方法大概了解了嗎?如果想了解更多相關(guān)文章內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)頁名稱:函數(shù)裝飾器和類裝飾器的使用方法
文章地址:http://www.rwnh.cn/article46/jepheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、移動網(wǎng)站建設(shè)ChatGPT、網(wǎng)站維護、自適應(yīng)網(wǎng)站網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
阿拉善左旗| 孝感市| 平泉县| 奇台县| 宁城县| 武鸣县| 新津县| 松潘县| 盘锦市| 祥云县| 格尔木市| 通州市| 鹿邑县| 台州市| 山西省| 永平县| 安塞县| 河东区| 武陟县| 淳安县| 丽江市| 慈溪市| 比如县| 图们市| 岳西县| 增城市| 太和县| 沧州市| 玉溪市| 西林县| 秭归县| 呼图壁县| 大庆市| 新竹市| 盖州市| 益阳市| 吉安市| 沅陵县| 娱乐| 江北区| 徐闻县|