天天看點

python 元類與object_Python 元類metaclass 和 基類(超類)object

import os

'''

Python 基類和元類

- 看了那麼多問答, 其實我還是暈的. 其實單純看一個的話我是了解了, 但是兩個放一起, 就懵了. 想的腦袋都疼

- 基類 object:

- python 類繼承關系的頂端, object.__bases__ 它的繼承為空(), 也就是它是所有類的爸爸或者爺爺..., 所有類以它為起點

- 然後. Python一切皆對象, 是以 object 也是對象, 是對象就有實作類.

- 是以: object.__class__ 它的實作類是type

- 元類(metaclass) type:

- 單獨來看, 元類挺簡單的, 就是類工廠, 建立類的東西

- 元類是類的類。類定義類的執行個體(即對象)的行為,而元類定義類的行為。類是元類的執行個體。

- class關鍵字就是使用元類通過__new__和__init__建立出一個類

- 元類的還有一個作用就是定義類型, 定義object(對象的類型)

- 一起來看就很奇怪, 也是我沒有了解的地方

- object是type的執行個體

- type繼承object

- type是type自己的執行個體

- 代碼:

object.__class__

type.__class__

object.__bases__

()

type.__bases__

(,)

'''

'''

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__,執行或如何變化的類的行為。

'''