1 回答

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