Python 元類metaclass 和 基類(超類)object
阿新 • • 發佈:2020-12-28
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__,執行或如何變化的類的行為。 '''