Аннотация типов в классе

Как аннотировать переменные объекта класса?

class Node:
    def __init__(self, x: int) -> None:
         self.__x = x #?

Ответы (1 шт):

Автор решения: insolor

Пример из PEP 526 – Syntax for Variable Annotations, раздел "Class and instance variable annotations"

class BasicStarship:
    captain: str = 'Picard'               # instance variable with default
    damage: int                           # instance variable without default
    stats: ClassVar[Dict[str, int]] = {}  # class variable

Тут captain и damage - объявлены с аннотациями для атрибутов объекта (instance), третий вариант - с аннотацией для переменной класса. Правда, у captain значение по умолчанию делает этот атрибут переменной класса. Но в принципе инициализация объектами неизменяемых типов вполне допустима (первое переписваивание атрибута у объекта перекроет значение атрибута класса). С изменяемыми типами (например, списками) нужно быть осторожнее.

Таким образом, нужно объявить тип вашего поля на верхнем уровне класса:

class Node:
    __x: int
    
    def __init__(self, x: int) -> None:
        self.__x = x

Если попытаться присвоить значение другого типа, при проверке с помощью mypy выведется ошибка:

class Node:
    __x: int
    
    def __init__(self, x: float) -> None:
        self.__x = x
❯ mypy test.py
test.py:5: error: Incompatible types in assignment (expression has type "float", variable has type "int")
Found 1 error in 1 file (checked 1 source file)

PyCharm также подсветит проблему:

введите сюда описание изображения

→ Ссылка