溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何創(chuàng)建類?

發(fā)布時間:2020-05-26 14:49:17 來源:億速云 閱讀:191 作者:鴿子 欄目:開發(fā)技術(shù)

類的創(chuàng)建過程

以下說的類指的類本身,例如以下代碼:

class Foo:
  def __init__(self):
    pass

則指的 Foo 的創(chuàng)建過程,而不是 Foo 的實例。

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

根據(jù) MRO 規(guī)則解析繼承關(guān)系

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

查找元類的過程遵循以下規(guī)則:

  1. 如果沒有基類且沒有指定 metaclass ,則使用 type()

  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.)

4. 執(zhí)行 Class 內(nèi)語句(Executing the class body)

類內(nèi)的語句通過 exec(body, globals(), namespace) 來執(zhí)行。與正常的 exec() 不同的是當類定義在一個函數(shù)內(nèi)部時其可以訪問當前和外層的作用域。

即使在函數(shù)內(nèi)定義的類,其內(nèi)部的方法也無法訪問類的作用域。類內(nèi)的定義的變量通過類實例或類對象來訪問,或者通過 __class__ 。

5. 創(chuàng)建類對象(Creating the class object)

經(jīng)過以上步驟后,通過 metaclass(name, bases, namespace, **kwargs) 來創(chuàng)建類。

關(guān)于 __init__

以上步驟是創(chuàng)建類自身。例如開頭的例子,以上步驟只是創(chuàng)建了 Foo ,__init__ 是類實例化后才執(zhí)行的,f = Foo() 這時候才會執(zhí)行 __init__

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI