您好,登錄后才能下訂單哦!
以下說的類指的類本身,例如以下代碼:
class Foo:
def __init__(self):
pass
則指的 Foo
的創(chuàng)建過程,而不是 Foo
的實例。
MRO
記錄(Resolving MRO entries)根據(jù) MRO
規(guī)則解析繼承關(guān)系
查找元類的過程遵循以下規(guī)則:
如果沒有基類且沒有指定 metaclass
,則使用 type()
metaclass
且它不是 type()
的實例,則直接使用 metaclass
type()
實例的 metaclass
或者有基類,(the most derived metaclass is used. )當元類確定后,類的命名空間也可以確定了。 如果元類有 __prepare__
屬性,則 namespace = metaclass.__prepare__(name, bases, **kwargs)
,否則命名空間會初始化為有序的空map(empty ordered mapping.)
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__
。
經(jīng)過以上步驟后,通過 metaclass(name, bases, namespace, **kwargs)
來創(chuàng)建類。
__init__
以上步驟是創(chuàng)建類自身。例如開頭的例子,以上步驟只是創(chuàng)建了 Foo
,__init__
是類實例化后才執(zhí)行的,f = Foo()
這時候才會執(zhí)行 __init__
免責聲明:本站發(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)容。