Если я правильно понимаю, я думаю, что ваша текущая проблема заключается в том, что у вас есть «необработанные» данные о продукте, которые вы хотите сохранить в объектах, и вы «обработали» (отформатированные) данные о продукте, которые вы также хотите сохранить в объекты. Ваш вопрос заключается в том, чтобы смешать их.
Позвольте мне сначала указать на другой очевидный вариант. А именно, имея два класса продуктов: RawProduct и ProcessedProduct. Что делать?
(Изменить: также, чтобы убедиться, что данные продукта не должны храниться в поставщике. Поставщик выполняет форматирование, но данные - это данные продукта. Не данные поставщика).
Это зависит. Есть несколько соображений:
1) В общем, в ООП идея состоит в том, чтобы связать действия над данными с данными. Поэтому, если возможно, у вас есть некоторый метод в ProductBase, например, «format ()», где format отправляет объект в API для форматирования и сохраняет результат в переменной экземпляра. Затем вы также можете иметь метод, подобный «find_image», который отправляет и получает URL-адрес изображения из API, а затем сохраняет его в поле. Данные объекта должны быть динамическими. Он предназначен для изменения объектными методами.
2) Если вам нужен контроль версий (если вы хотите, чтобы была доступна полная история состояния объекта), то вы не можете переопределить поля новыми данными. Поэтому вам нужно либо хранить историю каждого поля объекта в объекте, либо создавать новые объекты.
3) ОЗУ беспокоит? Иногда я создаю классы данных, в которых хранится только последняя часть жизни объекта, чтобы я мог разместить больше объектов в памяти.
Лично я часто нахожу себя создающим классы "RawObject" и "ProcessedObject", это просто легче в большинстве случаев. Но это, вероятно, потому что я в основном работаю с обработкой документов, так что это очень ясно. Обычно вы просто обновляете данные объектов.
Преимущество наличия одного объекта с полной историей состоит в том, что его гораздо легче отлаживать. Потому что необработанные данные и результат API находятся в одном объекте. Таким образом, вы можете очень легко проверить, что пошло не так. Если вы начнете делить вещи, это будет сложнее отследить. В общем, чем больше у объекта информации о том, где он был, тем легче понять, что с ним не так.
Помните также, что, поскольку это вопрос Python, Python является мультипаридигмой. И если вы пишете конвейерные архитектуры (синхронные, линейные процессы), то функциональный подход также может работать хорошо.
Как только ваши данные сохранены в объекте продукта, все может содержать ссылку на это. Таким образом, магазин может ссылаться на объект, а продукт может ссылаться на объект. Проясните разницу между отношениями «есть» и «есть».