内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

函數(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)化排名
武山县| 永昌县| 肥西县| 黄骅市| 民丰县| 大名县| 韶关市| 广宁县| 通河县| 淮北市| 克东县| 常山县| 阿合奇县| 平泉县| 元朗区| 宜都市| 台东县| 保康县| 尼木县| 华池县| 曲沃县| 广河县| 新干县| 永川市| 温州市| 丹东市| 扬州市| 莱阳市| 上饶县| 蚌埠市| 桑植县| 杭锦旗| 新竹县| 彩票| 石嘴山市| 甘泉县| 腾冲县| 岳池县| 萝北县| 尉氏县| 广州市|