這篇文章主要為大家詳細(xì)介紹了函數(shù)裝飾器和類裝飾器的使用方法,文中示例代碼介紹的非常詳細(xì),零基礎(chǔ)也能參考此文章,感興趣的小伙伴們可以參考一下。
梁河網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年開始到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。裝飾器算是類里面比較難的內(nèi)容之一,但是實(shí)際上它的思想并不復(fù)雜。簡單點(diǎn)說,就是在你原來內(nèi)容的基礎(chǔ)上,在外面給你加點(diǎn)東西,實(shí)現(xiàn)類似裝飾的效果。但是它是怎么實(shí)現(xiàn)的呢?一般來說,都是通過攔截函數(shù)調(diào)用來實(shí)現(xiàn)的,比如:用裝飾器裝飾函數(shù)的時候,它攔截函數(shù)調(diào)用,裝飾類的時候,它攔截類實(shí)例的創(chuàng)建調(diào)用,即攔截類初始化__init__
函數(shù)。
知道這個原理以后,我們就可以來嘗試實(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的實(shí)現(xiàn),它返回一個函數(shù)調(diào)用,當(dāng)用它來裝飾一個類,創(chuàng)建類實(shí)例的時候,就會用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é)果是一樣的?因?yàn)樵趧?chuàng)建實(shí)例的過程中,__init__
函數(shù)被onCall函數(shù)攔截,此時會進(jìn)入到createInstance函數(shù)的流程中,會對這個類實(shí)例進(jìn)行判斷,如果不存在這個類的實(shí)例,那么就初始化一個后返回,如果存在,直接返回第一個創(chuàng)建的類實(shí)例。因此最終只有一個類實(shí)例存在,就實(shí)現(xiàn)類單例類。
上面最開始的位置我們說了,函數(shù)裝飾器和類裝飾器都是攔截函數(shù)調(diào)用,在函數(shù)裝飾器實(shí)現(xiàn)類調(diào)用攔截的地方我們看到,它是通過函數(shù)裝飾器內(nèi)部的函數(shù)來實(shí)現(xiàn)攔截的。如果是類裝飾器呢,它通過什么來攔截呢?
答案是call函數(shù)來攔截,我們來看一下類裝飾器的實(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ù)裝飾器相比,其實(shí)功能沒有太多變化,通過__call__
方法來接收被攔截類的初始化函數(shù)參數(shù)args,然后用args來初始化類實(shí)例。但是只在這個類還沒有實(shí)例的情況下進(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ù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。