Python 類、元類小實驗

理解python的類實例化
class type(name, bases, dict)官方定義
object.__new__(cls[, ...])官方定義
Customizing class creation 定制類創建 官方文檔
Built-in Types 內建類型 官方文檔

準備知識

  • 當一個類定義被執行,發生了這些事:
    • 一個合適的元類被確定
    • 類命名空間被準備好
    • 類主體被執行
    • 類對象被創建
  • 類中定義的__new__(cls[, ...])方法用來創建類cls的一個新實例,它是特殊的不用聲明的靜態方法。
  • 類中對__call__方法的定義意味著對該類的實例的括號運算符的重載。
  • type(x)返回x的類型。類是元類的實例(Python中一切皆對象,類也是對象,對象是類的實例,只不過類的類是特殊的元類),所以int的類是type(元類)。表示構造關系。整型1由int類構造,int類由元類構造。(類名+括號運算符調用類的構造函數,類定義的過程即是元類實例化的過程,元類中實現了構造類的規則)。
a = 1
type(a)
# int
type(int)
# type
  • x.__mro__返回類x的所有超類(父類)(包括x自身)(MRO-方法解析順序),表示類之間的繼承關系,int繼承object。繼承關系和構造關系是兩回事。
int.__mro__
# (int, object)

實驗


理解

  • MyType繼承type并重載type中的方法,是我們自定義的元類。指定類MyTypeInstance的元類為MyType意味著用MyType來構建類MyTypeInstanceMyType中重載的__new____init__方法影響類MyTypeInstance的定義過程。__new__可以控制類名與類屬性的審查,__init__可以增加或修改類的屬性。而MyType__call__方法則控制類MyTypeInstance的實例化過程。

  • MyType元類默認是type(與繼承type無關),即MyTypetype的實例,亦即MyType = type(name, bases, dict)MyType的定義過程(即type類的實例化過程)調用的是type__call__方法。
    __new__是靜態方法,__call____init__是實例方法。實際上isinstance(type, type)得到True,即typetype的實例,type調用__call__方法也就說得通了,也就是type實例+()運算符 等于 type實例調用了它的類type中定義的__call__實例方法。在__call__方法中先調用__new__靜態方法來產生一個python對象,然后調用type實例的__init__方法修改新對象的屬性。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,993評論 19 139
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,789評論 0 9
  • 了解元類之前,先了解幾個魔術方法: __new__、__init__、__call__ __new__: 對象的創...
    大富帥閱讀 9,214評論 2 16
  • Python 面向對象Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創建一個類和對...
    順毛閱讀 4,241評論 4 16
  • 夢到一條特殊的魚向我游來 一條月光下的魚 一支銀輝波動的浪漫曲 一首療傷的陽光詩 這條魚融進渴望與透明 這會兒奔迸...
    花香一路閱讀 272評論 2 16