Как реализовать композицию классов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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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