1. 程式人生 > 實用技巧 >Python 元類metaclass 和 基類(超類)object

Python 元類metaclass 和 基類(超類)object

import os


'''
Python 基類和元類
    - 看了那麼多問答, 其實我還是暈的. 其實單純看一個的話我是理解了, 但是兩個放一起, 就懵了. 想的腦袋都疼
    - 基類 object:
        - python 類繼承關係的頂端,  object.__bases__  它的繼承為空(), 也就是它是所有類的爸爸或者爺爺..., 所有類以它為起點
        - 然後. Python一切皆物件, 所以 object 也是物件, 是物件就有實現類.
        - 所以: object.__class__  它的實現類是type   <class 'type'>
    - 元類(metaclass) type:
        - 單獨來看, 元類挺簡單的, 就是類工廠, 建立類的東西
        - 元類是類的類。類定義類的例項(即物件)的行為,而元類定義類的行為。類是元類的例項。
        - class關鍵字就是使用元類通過__new__和__init__創建出一個類
        - 元類的還有一個作用就是定義型別, 定義object(物件的型別)
        
    - 一起來看就很奇怪, 也是我沒有理解的地方
        - object是type的例項
        - type繼承object
        - type是type自己的例項
        
    - 程式碼:
        object.__class__
            <class 'type'>
        type.__class__
            <class 'type'>
        object.__bases__
            ()
        type.__bases__
            (<class 'object'>,)
'''



'''
stack over flow 關於元類的回答:

    元類是類的類。類定義類的例項(即物件)的行為,而元類定義類的行為。類是元類的例項。
    
    儘管在Python中您可以對元類使用任意可呼叫物件(例如Jerub演示),但是更好的方法是使其成為實際的類。
    type是Python中常見的元類。type它本身是一個類,並且是它自己的型別。您將無法type純粹在Python中重新建立類似的內容,但是Python有點作弊。
    要在Python中建立自己的元類,您實際上只想將其子類化type。
    
    元類最常用作類工廠。當通過呼叫類建立物件時,Python通過呼叫元類來建立一個新類(當執行“ class”語句時)。
    因此,將元類與普通方法__init__和__new__方法結合使用,可以使您在建立類時做“額外的事情”,例如使用某些登錄檔註冊新類或將其完全替換為其他類。
    
    當class執行語句時,Python首先將class語句的主體作為普通程式碼塊執行。生成的名稱空間(字典)保留了將來類的屬性。通過檢視要成為類的基類(繼承了元類),
    要成為類的__metaclass__屬性(如果有)或__metaclass__全域性變數來確定元類。然後使用該類的名稱,基數和屬性呼叫該元類以例項化它。
    
    但是,元類實際上定義了一個類的型別,而不僅僅是它的工廠,因此您可以使用它們做更多的事情。
    例如,您可以在元類上定義常規方法。這些元類方法就像類方法,因為它們可以在沒有例項的情況下在類上呼叫,但是它們也不像類方法,因為它們不能在類的例項上被呼叫。
    type.__subclasses__()是type元類上方法的示例。您還可以定義正常的“魔力”的方法,如__add__,__iter__和__getattr__,執行或如何變化的類的行為。
'''