Меня очень смущает следующий код:
import dataclasses
@dataclasses.dataclass()
class Base():
x: int = 100
@dataclasses.dataclass()
class Derived(Base):
x: int = 200
@dataclasses.dataclass()
class DerivedRaw(Base):
x = 300
base = Base()
derived = Derived()
derived_raw = DerivedRaw()
print(base.x)
print(derived.x)
print(derived_raw.x)
То, что он печатает:
100
200
100
Я не понимаю, почему последнее число не 300. Почему аннотации имеют значение?
Кажется, это взаимодействие с @dataclasses.dataclass(), поскольку код:
class Base():
x: int = 100
class DerivedRaw(Base):
x = 300
derived_raw = DerivedRaw()
print(derived_raw.x)
Печатает 300.






Из dataclassдокументации:
Декоратор @dataclass проверяет класс на наличие полей. Поле определяется как переменная класса, имеющая аннотацию типа.
...
Таким образом, чтобы иметь правильное поле класса данных, оно должно иметь аннотацию типа.