在 Python 中,不僅實例是物件,類別本身也是物件。例如:
class Foo(object):
def __init__(self):
pass
obj = Foo()
print(type(obj)) #
print(type(Foo)) #
Foo 類別是由 type 類別建構而來。這引出了 Python 物件體系的兩大基石:<type 'object'> 與 <type 'type'>。
type 的類型是 type 本身,父類別是 object。object 的類型是 type,無父類別。二者相互依賴,共同構成 Python 物件系統的基礎。
class Foo(object):
def func(self):
print('hello')
def func(self):
print('hello')
Foo = type('Foo', (object,), {'func': func})
第一個參數為類別名,第二個為父類別元組,第三個為屬性字典。本質上皆是 type 實例化產生類別物件。
__new__:實例化類別時最先被呼叫,負責建立物件並回傳。__init__:在 __new__ 之後執行,負責初始化實例屬性。__metaclass__:指定類別由哪個元類別建構,可用於攔截類別建構過程。__metaclass__ = MyType,指定 MyType 負責建構 Foo 類別。MyType.__new__ 呼叫 type.__new__(cls, name, bases, attrs) 建立類別物件。MyType.__init__ 初始化類別屬性、方法。Foo() 實例化時,先尋找 __new__,再執行 __init__。元類別雖強大但複雜,簡單類別無需濫用。常見替代技術:
理解元類別有助於掌握框架級原始碼(如 Django ORM、SQLAlchemy)的核心設計。