如下說的類指的類自己,例如如下代碼:python
class Foo: def __init__(self): pass
則指的 Foo
的建立過程,而不是 Foo
的實例。markdown
MRO
記錄(Resolving MRO entries)根據 MRO
規則解析繼承關係app
查找元類的過程遵循如下規則:ide
若是沒有基類且沒有指定 metaclass
,則使用 type()
函數
metaclass
且它不是 type()
的實例,則直接使用 metaclass
type()
實例的 metaclass
或者有基類,(the most derived metaclass is used. ??)當元類肯定後,類的命名空間也能夠肯定了。 若是元類有 __prepare__
屬性,則 namespace = metaclass.__prepare__(name, bases, **kwargs)
,不然命名空間會初始化爲有序的空map(empty ordered mapping.)spa
Class
內語句(Executing the class body)類內的語句經過 exec(body, globals(), namespace)
來執行。與正常的 exec()
不一樣的是當類定義在一個函數內部時其能夠訪問當前和外層的做用域。code
即便在函數內定義的類,其內部的方法也沒法訪問類的做用域。類內的定義的變量經過類實例或類對象來訪問,或者經過 __class__
。對象
通過以上步驟後,經過 metaclass(name, bases, namespace, **kwargs)
來建立類。繼承
__init__
以上步驟是建立類自身。例如開頭的例子,以上步驟只是建立了 Foo
,__init__
是類實例化後才執行的,f = Foo()
這時候纔會執行 __init__
作用域