Подкласс данных Python определяет унаследованные атрибуты

#python-3.x #inheritance #python-dataclasses

Вопрос:

У меня есть 2 класса данных, как показано ниже:

 from dataclasses import dataclass  @dataclass class Line:  x: int  length: int  color: str  @dataclass class Rectangle(Line):  y: int  height: int  fill: bool   def get_dict(self):  """ return only y, height, and fill """  

Если я создам Rectangle объект, можно ли определить, какие атрибуты наследуются от родительского класса данных?

Например, как я могу реализовать get_dict() метод Rectangle без явного ввода всех переменных и их значений?

Ответ №1:

Обратите внимание, что dataclasses имеет asdict вспомогательную функцию, которую можно использовать для сериализации класса данных в dict объект; однако она также включает поля из суперкласса Line , например, так что, вероятно, это не то, что вам здесь нужно.

Я бы предложил изучить другие атрибуты, например Rectangle.__annotations__ , которые должны содержать только список полей класса данных, которые являются эксклюзивными для класса Rectangle . Например:

 from dataclasses import dataclass, asdict from typing import Any   @dataclass class Line:  x: int  length: int  color: str   @dataclass class Rectangle(Line):  y: int  height: int  fill: bool   def get_dict(self) -gt; dict[str, Any]:  """ return only y, height, and fill """  return {f: getattr(self, f) for f in self.__annotations__}  # return asdict(self)   print(Rectangle(1, 2, 3, 4, 5, 6).get_dict())  

Следует возвращать только те поля, которые являются исключительными для Rectangle :

 {'y': 4, 'height': 5, 'fill': 6}