首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 類型關係與繼承關係深度解析

     編輯:更多程式設計知識

Python 物件系統建立在兩大核心關係之上:類型關係(由誰建立)與繼承關係(誰繼承誰)。本文從 type 元類、__class__、__bases__、__metaclass__ 等底層機制出發,系統闡述新式類與經典類的差異,幫助開發者建立正確的物件模型心智圖。

核心概念:type 是類別的類別

>> type(int)

>>> type(type)
  # type 自己是自己的實例(元類的遞歸定義)
>>> class A(object): pass
>>> A.__class__

>>> type(A)

  • 所有新式類(繼承 object)的類型都是 type。
  • type 本身也是類別,其類型同為 type(類似根目錄的父目錄是自己)。

類型關係樹

type (根)
├── 內建型別: int, str, list, dict, ...
├── 使用者定義類別 (class A)
│   └── 實例
└── 元類 (class MyMeta(type))
    └── 使用者定義類別 (class B, __metaclass__=MyMeta)
        └── 實例

每個物件的 __class__ 指向其類別;每個類別的 __class__ 指向 type(或其子類)。

繼承關係圖

>> class A(object): pass
>>> class B(A): pass
>>> B.__bases__
(,)
>>> issubclass(B, A)
True
>>> isinstance(B(), A)
True
  • 繼承關係構成有向無環圖(DAG),object 為根。
  • type 繼承自 object(type.__bases__ == (object,))。
  • object 的類型是 type(object.__class__ is type)。

動態建立類別:type() 三參數形式

# 等價於 class A(object): def f(self): print(1)
def f(self): print(1)
A = type('A', (object,), {'f': f})
del f
  • 參數:類別名稱(字串)、父類別元組、屬性字典。
  • class 關鍵字本質是語法糖,編譯後呼叫 type.__new__。

自訂元類

class MyMeta(type):
    def __new__(mcs, name, bases, attrs):
        print(f"Creating class {name}")
        return super(MyMeta, mcs).__new__(mcs, name, bases, attrs)

class MyClass(object):
    __metaclass__ = MyMeta  # Python 2 語法
# Python 3: class MyClass(metaclass=MyMeta):

元類允許攔截類別建立過程,實現屬性驗證、自動註冊、AOP 等進階模式。

經典類 vs 新式類

Python 3 移除了經典類,所有類別隱式繼承 object。

物件導航網絡

每個物件持有對其他物件的引用(id),形成龐大網絡。Python 執行本質上是:

  1. 修改此網絡(建立/刪除引用、修改屬性)。
  2. 執行有副作用的程式碼物件(I/O、C 擴充)。

總結

理解 type、__class__、__bases__、__metaclass__ 之間的關係,是掌握 Python 物件模型、元編程、框架設計的基石。新式類統一了類型與類別系統,使得「一切皆物件」真正落地。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性經典類新式類
定義class A:class A(object):
類型types.ClassTypetype
__class__無有
MRO深度優先C3 線性化
super()不支援支援
描述器/屬性不支援完整支援