2 回答

TA貢獻1826條經驗 獲得超6個贊
因為當它遇到時Translate(在編譯類主體時),Vector2尚未被定義(當前正在編譯中,尚未執行名稱綁定);Python自然會抱怨。
由于這是一種常見的情況(在該類的主體中鍵入一個類的類型),因此應使用對它的前向引用,將其括在引號中:
class Vector2:
# __init__ as defined
def Translate(self, pos: 'Vector2'):
self.x += pos.x
self.y += pos.y
Python(以及所有符合的檢查程序PEP 484)將理解您的提示并進行適當的注冊。__annotations__通過typing.get_type_hints以下方式訪問時,Python確實會識別出這一點:
from typing import get_type_hints
get_type_hints(Vector2(1,2).Translate)
{'pos': __main__.Vector2}

TA貢獻1828條經驗 獲得超6個贊
您要求的功能稱為正向(類型)引用,并且從3.7(在PEP 563中)起已添加到Python中。1因此,這現在有效:
from __future__ import annotations
class C:
def spam(self, other: C) -> C:
pass
注意__future__聲明。直到4.0才需要。
不幸的是,在Python 3.6及更早版本中,此功能不可用,因此您必須使用字符串注釋,如Jim Fasarakis Hilliard的答案所述。
Mypy已經支持前向聲明,即使在Python 3.6下運行時也是如此。但是,如果靜態類型檢查器說您的代碼很好,但是NameError當您嘗試實際運行它時,解釋器會引發一個正向聲明,這對您沒有多大幫助。
1.這已在PEP 484中討論為可能的功能,但在人們對在批注中使用前向聲明有更多經驗之后,將其推遲到以后。PEP 563 / Python 3.7就是“后來的”。
添加回答
舉報