python - 使用類作為其方法中參數的類型提示
python-3.x oop (2)
我下麵包含的代碼引發以下錯誤:
NameError: name 'Vector2' is not defined
在這一行:
def Translate (self, pos: Vector2):
為什麼Python在
Translate
方法中無法識別我的
Vector2
類?
class Vector2:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
def Translate(self, pos: Vector2):
self.x += pos.x
self.y += pos.y
因為當遇到
Translate
(在編譯類主體時)時,尚未定義
Vector2
(當前正在編譯,尚未執行名稱綁定);
Python自然會抱怨。
由於這是一種常見的情況(在該類的主體中鍵入一個類的類型),因此應使用對它的 前向引用 ,將其括在引號中:
class Vector2:
# __init__ as defined
def Translate(self, pos: 'Vector2'):
self.x += pos.x
self.y += pos.y
Python(以及符合
PEP 484
所有檢查程序)將理解您的提示並進行適當的註冊。
當通過
typing.get_type_hints
訪問
typing.get_type_hints
時,Python會意識到這
typing.get_type_hints
:
from typing import get_type_hints
get_type_hints(Vector2(1,2).Translate)
{'pos': __main__.Vector2}
自Python 3.7起已更改。 請參閱 下面的abarnert的答案 。
您要求的功能稱為正向(類型)引用,並且從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就是“後來的”。