最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python面向對象值元類的聲明周期詳解

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

元類的生命周期

我們之前介紹過,關于類的生命周期,這里先簡單回顧下,如果將類實例化對象后,會執(zhí)行內置方法為:會先執(zhí)行__new__內置方法 而后會執(zhí)行 __init__內置方法。當我們執(zhí)行對象的時候,會執(zhí)行__call__內置方法。

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

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

我們定義代碼如下:

上述代碼,我們將類ClassName和其元類mateClass,我們都重寫了__init____call__、__new__以及__del__方法。我們暫時先不管這些方法中的語句含義,我們先執(zhí)行一次代碼,看看執(zhí)行結果:

哎,你是否感覺好奇,為什么我們還沒有開始執(zhí)行c = ClassName()就已經執(zhí)行了mateClass類中的__new__方法 和 __init__方法呢?

這是因為我們在定義ClassName類的時候指定了其元類mateClass,所以當我們定義ClassName的時候,就會去執(zhí)行該元類的__new__方法 和 __init__方法。

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

這是因為我們指定元類的時候,代碼如下:

class ClassName(metaclass=mateClass):

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

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

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

元類是如何控制類的創(chuàng)建過程的

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

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

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

該語句會創(chuàng)建一個新類,隨后將該類返回回去。

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

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)

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

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

class ClassName(metaclass=mateClass):
    pass

該類名就符合規(guī)則,不會報錯,若將名稱更換為其他不符合規(guī)則的名稱,則會拋錯:

例如:

class d123(metaclass=mateClass):
    pass

若我們將名稱修改為長名稱,如:

class d888888888888888abdassd(metaclass=mateClass):
    pass

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

總結

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

到此這篇關于python面向對象值元類的聲明周期詳解的文章就介紹到這了,更多相關python元類聲明周期內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Python第三方庫xlrd/xlwt的安裝與讀寫Excel表格

    Python第三方庫xlrd/xlwt的安裝與讀寫Excel表格

    最近開始學習python,想做做簡單的自動化測試,需要讀寫excel,于是就接觸到了Python的第三方庫xlrd和xlwt,下面這篇文章就給大家主要介紹了Python中第三方庫xlrd/xlwt的安裝與讀寫Excel表格的方法,需要的朋友可以參考借鑒。
    2017-01-01
  • Python Process創(chuàng)建進程的2種方法詳解

    Python Process創(chuàng)建進程的2種方法詳解

    這篇文章主要介紹了Python Process創(chuàng)建進程的2種方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • python輸入一個水仙花數(三位數) 輸出百位十位個位實例

    python輸入一個水仙花數(三位數) 輸出百位十位個位實例

    這篇文章主要介紹了python輸入一個水仙花數(三位數) 輸出百位十位個位實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python利用elaphe制作二維條形碼實現代碼

    python利用elaphe制作二維條形碼實現代碼

    條形碼的應用將會越來越廣泛,看到了一篇文章,寫的挺好的!用手機拍二維碼,查二維碼確實很爽!這將成為一種潮流
    2012-05-05
  • Python3.9.0 a1安裝pygame出錯解決全過程(小結)

    Python3.9.0 a1安裝pygame出錯解決全過程(小結)

    這篇文章主要介紹了Python3.9.0 a1安裝pygame出錯解決全過程(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Python讀取文件的三種方式總結

    Python讀取文件的三種方式總結

    Python的文本處理是經常碰到的一個問題,非常重要的,這篇文章主要和大家分享的是3個Python讀取文本文件內容的常用方法,希望對大家深入學習Python有所幫助
    2023-07-07
  • python讀取多類型文件夾中的文檔內容

    python讀取多類型文件夾中的文檔內容

    無論我們使用哪種編程語言,處理文件對于每個程序員都是必不可少的,本文主要介紹了python讀取多類型文件夾中的文檔內容,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • PyTorch實現圖像識別實戰(zhàn)指南

    PyTorch實現圖像識別實戰(zhàn)指南

    圖像識別是從給定圖像中提取有意義的信息(例如圖像內容)的過程,下面這篇文章主要給大家介紹了關于PyTorch實現圖像識別的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-02-02
  • Pandas時間數據處理詳細教程

    Pandas時間數據處理詳細教程

    日常工作中日期格式有多種表達形式,比如年份開頭或是月份開頭2022/6/4、6/4/2022等,通過pandas的日期數據處理,這篇文章主要給大家介紹了關于Pandas時間數據處理的相關資料,需要的朋友可以參考下
    2023-01-01
  • 淺談python數據類型及其操作

    淺談python數據類型及其操作

    今天帶大家了解python數據類型的相關知識,文中介紹的非常詳細,對正在學習python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評論

临邑县| 汝阳县| 靖边县| 阿坝县| 永修县| 梅州市| 林芝县| 河东区| 娄烦县| 抚顺市| 柳河县| 衡山县| 黄大仙区| 盐源县| 霍州市| 太和县| 清河县| 通化市| 米脂县| 英山县| 锡林浩特市| 莎车县| 吉隆县| 修文县| 华容县| 伊金霍洛旗| 五寨县| 东安县| 临邑县| 肃北| 思茅市| 唐河县| 吉木萨尔县| 突泉县| 恩平市| 河曲县| 宜州市| 耿马| 广河县| 左云县| 靖安县|