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