亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么反匯編一個Python類定義會顯示兩個相同的類名的LOAD_CONST?

為什么反匯編一個Python類定義會顯示兩個相同的類名的LOAD_CONST?

湖上湖 2023-10-18 16:00:55
我想知道為什么PythonLOAD_CONST在定義一個類時會兩次使用相同的值(類名)。當我運行這段代碼時:from dis import disdis("class A(): pass")這是我得到的輸出:  1           0 LOAD_BUILD_CLASS              2 LOAD_CONST               0 (<code object A at 0x0000021DCE681B70, file "<dis>", line 1>)              4 LOAD_CONST               1 ('A')              6 MAKE_FUNCTION            0              8 LOAD_CONST               1 ('A')             10 CALL_FUNCTION            2             12 STORE_NAME               0 (A)             14 LOAD_CONST               2 (None)             16 RETURN_VALUEDisassembly of <code object A at 0x0000021DCE681B70, file "<dis>", line 1>:  1           0 LOAD_NAME                0 (__name__)              2 STORE_NAME               1 (__module__)              4 LOAD_CONST               0 ('A')              6 STORE_NAME               2 (__qualname__)              8 LOAD_CONST               1 (None)             10 RETURN_VALUE正如您在第 3 行和第 5 行中看到的,有兩個LOAD_CONST帶有類名。LOAD_CONST如果類名已經加載,為什么還要使用相同的數據創建第二個呢?MAKE_FUNCTION這和他們之間有什么關系嗎LOAD_CONST?我在 python 3.7.4 64 位上運行它
查看完整描述

1 回答

?
慕姐4208626

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

我們完成了。


查看完整回答
反對 回復 2023-10-18
  • 1 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號