#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}