Как реализовать композицию классовPython

Программы на Python
Anonymous
Как реализовать композицию классов

Сообщение Anonymous »

Привет, у меня есть модель, содержащая несколько элементов, теперь все элементы имеют набор общих свойств: идентификатор, имя, родительский элемент. Кроме того, некоторые из этих элементов предназначены только для размещения других элементов. Некоторые предназначены для подключения к другим предметам и так далее. Пытаясь реализовать это, я могу подумать о наследовании, но я также могу подумать о композиции (и прочитал много комментариев, в которых говорилось, что я предпочитаю это). Таким образом, я могу определить класс с базовыми свойствами, основная задача которого — просто обеспечить доступ и разрешить их модификацию:

Код: Выделить всё

from attrs import define, Factory
@define
class BaseProperties:
identifier: str
name: str
parent_id: Optional[str]

@define
class ConnectorItem:
base_properties: BaseProperties
connections: "List[ConnectorItems]" = Factory(list)

@define
class ContainerItem:
base_properties: BaseProperties
children: "List[Union[ConnectorItem, ContainerItem]]" = Factory(list)
теперь дело в том, что когда я хочу получить доступ, например, к имени или идентификатору элемента-контейнера, мне нужно будет сделать:

Код: Выделить всё

container_item.base_properties.identifier
или определите свойство внутри ContainerItem.

Код: Выделить всё

@property
def identifier(self):
return self.base_properties.identifier
если я хочу просто использовать:

Код: Выделить всё

container_item.identifier
Теперь первый вариант выглядит так, будто пользователю необходимо знать о внутренней реализации моего класса ContainerItem, и он может привести к использованию большого количества точечных обозначений для доступа к некоторым членам по мере роста проекта.
Второй вариант кажется громоздким, когда мне нужно просто скопировать и вставить кучу свойств установки и получения в каждом из классов, содержащих класс BaseProperties.
Следует ли мне в этом случае использовать наследование вместо композиции? Дело в том, что даже если ContainerItem и ConnectorItem имеют общие основные свойства, я никогда не буду использовать их в одном и том же контексте, поэтому в этом случае мне не нужен полиморфизм, я думаю, просто базовое повторное использование кода.
Как лучше реализовать этот случай, зная, что это упрощенная версия, в действительности ConnectorItem может состоять из разных классов, например, для получения разных типов ConnectorItemTypes.>

Подробнее здесь: https://stackoverflow.com/questions/784 ... omposition

Вернуться в «Python»