Python類的建立過程

類的建立過程

如下說的類指的類自己,例如如下代碼:python

class Foo:
  def __init__(self):
    pass

則指的 Foo 的建立過程,而不是 Foo 的實例。app

1. 解析 MRO 記錄(Resolving MRO entries)

根據 MRO 規則解析繼承關係ide

2. 肯定元類(Determining the appropriate metaclass)

查找元類的過程遵循如下規則:函數

  1. 若是沒有基類且沒有指定 metaclass ,則使用 type()spa

  2. 若是指定了 metaclass 且它不是 type() 的實例,則直接使用 metaclass
  3. 若是指定了 type() 實例的 metaclass 或者有基類,(the most derived metaclass is used. ??)

3. 準備命名空間(Preparing the class namespace)

當元類肯定後,類的命名空間也能夠肯定了。 若是元類有 __prepare__ 屬性,則 namespace = metaclass.__prepare__(name, bases, **kwargs),不然命名空間會初始化爲有序的空map(empty ordered mapping.)code

4. 執行 Class 內語句(Executing the class body)

類內的語句經過 exec(body, globals(), namespace) 來執行。與正常的 exec() 不一樣的是當類定義在一個函數內部時其能夠訪問當前和外層的做用域。對象

即便在函數內定義的類,其內部的方法也沒法訪問類的做用域。類內的定義的變量經過類實例或類對象來訪問,或者經過 __class__繼承

5. 建立類對象(Creating the class object)

通過以上步驟後,經過 metaclass(name, bases, namespace, **kwargs) 來建立類。作用域

關於 __init__

以上步驟是建立類自身。例如開頭的例子,以上步驟只是建立了 Foo__init__ 是類實例化後才執行的,f = Foo() 這時候纔會執行 __init__it

相關文章
相關標籤/搜索