1 回答

TA貢獻1852條經(jīng)驗 獲得超7個贊
?CPython 中的類型創(chuàng)建暫時使用函數(shù)對象作為類主體。第一個“A”用于該函數(shù)的名稱。第二個“A”用于類名。
帖子的其余部分詳細解釋了這個反匯編:
?0?LOAD_BUILD_CLASS
壓builtins.__build_class__
入堆棧。隨后由 CALL_FUNCTION 調用它來構造一個類。
?2?LOAD_CONST???????????????0?(<code?object?A?at?0xCAFEF00D,?file?"<dis>",?line?1>)
將代碼 obj 壓入堆棧(這實際上包含解析的類塊 - 繼續(xù)閱讀)
?4?LOAD_CONST???????????????1?('A')
將“A”壓入堆棧
?6?MAKE_FUNCTION????????????0
將新的函數(shù)對象壓入堆棧。此操作還消耗堆棧上的前兩個內容(此函數(shù)的代碼 obj 及其限定名稱)
?8?LOAD_CONST???????????????1?('A')
再次將“A”壓入堆棧,以便可以用作 中的第二個參數(shù)builtins.__build_class__
,即類名。
10?CALL_FUNCTION????????????2
使用堆棧中的“A”和一個函數(shù)對象,調用__build_class__(<func>, 'A')
.?操作名稱后面的 2 指的是所咀嚼的位置參數(shù)的數(shù)量。最右邊的位置參數(shù)位于堆棧頂部,因此它們將是:類名'A'
,然后是 MAKE_FUNCTION 中剩余的 obj,它體現(xiàn)了類定義。這些參數(shù)的“下面”是可調用的__build_class__
,這個操作也消耗它。未提供任何接受的可選參數(shù)__build_class__(func, name, /, *bases, [metaclass], **kwds) -> class
。
12?STORE_NAME???????????????0?(A)
A = <top of stack>
,本質上是在命名空間中綁定新創(chuàng)建的類 obj
14?LOAD_CONST???????????????2?(None)
RETURN_VALUE 將返回堆棧頂部,但類語句 exec 不需要返回值,因此None
在返回之前加載。
16?RETURN_VALUE
我們完成了。
添加回答
舉報