欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python面向?qū)ο笾翟?lèi)的聲明周期詳解

 更新時(shí)間:2023年05月02日 08:40:23   作者:真的不能告訴你我的名字  
這篇文章主要介紹python的元類(lèi)生命周期,我們可以和之前探討類(lèi)的生命中周期一樣,我們寫(xiě)一個(gè)案例,使用print來(lái)輸出一些信息,來(lái)判斷如果基于元類(lèi)而言,那么生命周期是怎么樣的,文中有詳細(xì)的代碼示例,需要的朋友可以參考下

元類(lèi)的生命周期

我們之前介紹過(guò),關(guān)于類(lèi)的生命周期,這里先簡(jiǎn)單回顧下,如果將類(lèi)實(shí)例化對(duì)象后,會(huì)執(zhí)行內(nèi)置方法為:會(huì)先執(zhí)行__new__內(nèi)置方法 而后會(huì)執(zhí)行 __init__內(nèi)置方法。當(dāng)我們執(zhí)行對(duì)象的時(shí)候,會(huì)執(zhí)行__call__內(nèi)置方法。

如果該類(lèi)不是基于type來(lái)創(chuàng)建的,而是基于我們自己的元類(lèi),那么生命周期應(yīng)該是怎么樣的呢?

我們可以和之前探討類(lèi)的生命中周期一樣,我們寫(xiě)一個(gè)案例,使用print來(lái)輸出一些信息,來(lái)判斷如果基于元類(lèi)而言,那么生命周期是怎么樣的。

我們定義代碼如下:

上述代碼,我們將類(lèi)ClassName和其元類(lèi)mateClass,我們都重寫(xiě)了__init__、__call____new__以及__del__方法。我們暫時(shí)先不管這些方法中的語(yǔ)句含義,我們先執(zhí)行一次代碼,看看執(zhí)行結(jié)果:

哎,你是否感覺(jué)好奇,為什么我們還沒(méi)有開(kāi)始執(zhí)行c = ClassName()就已經(jīng)執(zhí)行了mateClass類(lèi)中的__new__方法 和 __init__方法呢?

這是因?yàn)槲覀冊(cè)诙xClassName類(lèi)的時(shí)候指定了其元類(lèi)mateClass,所以當(dāng)我們定義ClassName的時(shí)候,就會(huì)去執(zhí)行該元類(lèi)的__new__方法 和 __init__方法。

隨后我們執(zhí)行了c = ClassName(),這個(gè)是它會(huì)執(zhí)行mateClass__call__方法,我們之前有介紹過(guò),__call__方法不是要c()才調(diào)用么? 為什么這里調(diào)用了呢?

這是因?yàn)槲覀冎付ㄔ?lèi)的時(shí)候,代碼如下:

class ClassName(metaclass=mateClass):

這里打個(gè)比方,上述代碼它相當(dāng)于定義了一個(gè)ClassName,其類(lèi)型為mateClass,所以當(dāng)我們?cè)趫?zhí)行c = ClassName()就會(huì)觸發(fā)其類(lèi)的__call__方法,所以會(huì)執(zhí)行ClassName__call__方法。

隨后才執(zhí)行ClassName__new__方法 和 __init__方法。而后執(zhí)行函數(shù),最后銷(xiāo)毀的時(shí)候,先銷(xiāo)毀ClassName 再 銷(xiāo)毀mateClass。

那我們將其整理一下的話(huà),可以圖示為:

元類(lèi)是如何控制類(lèi)的創(chuàng)建過(guò)程的

上面已經(jīng)演示了元類(lèi)的生命周期,本篇文章我們將來(lái)看下,元類(lèi)是如何控制類(lèi)的創(chuàng)建過(guò)程的。

在此之前,我們要知道,元類(lèi)通過(guò)什么樣的方式來(lái)定義的類(lèi),可以看到我們上述的代碼,在元類(lèi)中的__new__方法中,我們返回了如下語(yǔ)句:

class mateClass(type):
    def __new__(cls, *args, **kwargs):
        newCls = super().__new__(cls, *args, **kwargs)
        return newCls

該語(yǔ)句會(huì)創(chuàng)建一個(gè)新類(lèi),隨后將該類(lèi)返回回去。

所謂的控制類(lèi)的創(chuàng)建過(guò)程,我們就可以在該__new__中判斷,傳入的參數(shù)等信息,比如說(shuō),我們想要嚴(yán)格規(guī)定創(chuàng)建的類(lèi)名,不少于6個(gè)字符,不多于20個(gè)字符,這個(gè)如何如何編寫(xiě)呢? 我們可以在元類(lèi)中的__new__方法下獲取傳上來(lái)的類(lèi)名,而后將其對(duì)比,若符合規(guī)則則返回類(lèi),若不符合規(guī)則,跑拋錯(cuò):

class mateClass(type):
    def __new__(cls, *args, **kwargs):
        classname = args[0]
        nameLen = len(classname)
        if nameLen >= 6 and nameLen <= 20:
            newCls = super().__new__(cls, *args, **kwargs)
            return newCls
        else:
            msg = "Class name %s does not meet the specifications" % (classname)

上述代碼,使我們定義了一個(gè)類(lèi)mateClass,其繼承type類(lèi),在該類(lèi)中,我們重寫(xiě)了__new__方法,在該方法中,我們首先獲取類(lèi)名args[0]將其賦值給classname,而后進(jìn)行匹配,若長(zhǎng)度大于6且小于20,則創(chuàng)建類(lèi),否則就拋錯(cuò)。

介于此,我們可以創(chuàng)建類(lèi),將元類(lèi)指向mateClass,例如:

class ClassName(metaclass=mateClass):
    pass

該類(lèi)名就符合規(guī)則,不會(huì)報(bào)錯(cuò),若將名稱(chēng)更換為其他不符合規(guī)則的名稱(chēng),則會(huì)拋錯(cuò):

例如:

class d123(metaclass=mateClass):
    pass

若我們將名稱(chēng)修改為長(zhǎng)名稱(chēng),如:

class d888888888888888abdassd(metaclass=mateClass):
    pass

這個(gè)案例就是所謂的使用元類(lèi)來(lái)控制類(lèi)的創(chuàng)建等。非常靈活,也非常強(qiáng)大。

總結(jié)

本篇文章,我們先介紹了元類(lèi)的生命周期,元類(lèi)的生命周期為,在定義類(lèi)a指定其元類(lèi)時(shí)候,元類(lèi)就會(huì)執(zhí)行__new__,__init__方法。在將類(lèi)a給實(shí)例化的時(shí)候,就會(huì)執(zhí)行元類(lèi)的__call__方法。后面就和普通的類(lèi)調(diào)用生命周期差不多。后面我們介紹了元類(lèi)是如何控制類(lèi)的創(chuàng)建過(guò)程的,我們介紹了幾個(gè)例子來(lái)說(shuō)明該功能。

到此這篇關(guān)于python面向?qū)ο笾翟?lèi)的聲明周期詳解的文章就介紹到這了,更多相關(guān)python元類(lèi)聲明周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論