亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

函數裝飾器和類裝飾器的使用方法

發布時間:2020-05-25 11:54:15 來源:億速云 閱讀:338 作者:Leah 欄目:編程語言

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

函數裝飾器實現

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

首先來看通過函數裝飾器攔截類的創建過程,代碼如下:

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

上面就是這個函數裝飾器singleIns的實現,它返回一個函數調用,當用它來裝飾一個類,創建類實例的時候,就會用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)

最終的輸出結果是:

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

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

類裝飾器實現

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

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

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

@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)

最終的結果和上面函數裝飾器的一樣,如下所示:

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

看完上述內容,你們對函數裝飾器和類裝飾器的使用方法大概了解了嗎?如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梁河县| 太谷县| 临清市| 苍溪县| 阜新市| 汝城县| 会同县| 惠东县| 建德市| 剑川县| 靖安县| 贺州市| 尤溪县| 沅江市| 平果县| 五寨县| 通化市| 平江县| 冕宁县| 中西区| 柏乡县| 寿阳县| 大兴区| 前郭尔| 枣强县| 建平县| 定襄县| 阳曲县| 宜宾县| 昌乐县| 庆云县| 宿迁市| 晋城| 英德市| 茌平县| 霸州市| 青铜峡市| 灵川县| 通河县| 徐闻县| 玛沁县|