Ответ 1
У вас есть форвардная декларация; функции (связанные как методы) создаются до класса, поэтому имя Vector
еще не существует. Только когда все тело класса было выполнено, Python может создать объект class
и привязать к нему имя Vector
.
Просто используйте строку с именем:
class Vector:
# Various irrelevant implementation details
def __add__(self, other: 'Vector') -> 'Vector':
# More implementation details....
Это не влияет на то, как ваша среда ID видит объявление; строки просматриваются после загрузки всего модуля и разрешаются как допустимое выражение Python в текущем контексте. Поскольку класс Vector
существует после загрузки всего модуля, строка 'Vector'
может быть правильно преобразована в объект класса.
Также см. спецификацию для передовых ссылок:
Если подсказка типа содержит имена, которые еще не определены, это определение может быть выражено как строковый литерал, который будет разрешен позже.
[...]
Строковый литерал должен содержать допустимое выражение Python [...], и он должен оценивать без ошибок после полной загрузки модуля.