2014-12-10 5 views
2

У меня есть простой вопрос с практикой, а не технический/«как я?» Вопрос, связанный с объектно-ориентированным программированием в Python.Python Когда ООП и когда не ООП

Я недавно работал над некоторым кодом OOP Python, который читает данные и хранит их в классе на заказ. Это слишком подробно, чтобы опубликовать весь код здесь, поэтому я сделаю очень простой пример, используя торты.

Мой основной класс - торт - выглядит примерно так и хранит различные атрибуты данных о каждом «пироге». Некоторые переменные являются строками, например. имя, тогда как другие являются целыми числами или плавают, например. слои.

class cake(): 

    def __init__(self, name, layers, icing): 
     self.name = name 
     self.layers = layers 
     self.icing = icing 

Большое количество этих объектов создается, когда данные считываются, все из которых хранятся в списке:

cakebox = [] 
cakebox.append(cake("chocolate", 2, "Y")) 
cakebox.append(cake("chocolate", 3, "Y")) 
cakebox.append(cake("chocolate", 2, "N")) 
cakebox.append(cake("lemon", 3, "Y")) 
cakebox.append(cake("jamsponge", 2, "N")) 
cakebox.append(cake("fruit", 1, "N")) 

......... и т.д.

Идея списка 'cakebox' состоит в том, чтобы действовать как простая «база данных», из которой можно получить результаты. Это легко сделать, используя списочные, такие как

icingcakes = [x for x in cakebox if x.icing == "Y"] 

Но некоторые операции я нахожу, что я делаю снова и снова, например, получить все уникальные имена торт:

uniquecakenames = list(set([x.name for x in cakebox])) 

Учитывая это, я использую код (или аналогичный) несколько раз, я бы лучше сделать «cakebox» классом с этим кодом как методом, возможно, используя «список» в качестве суперкласса, или я усложняю ситуацию, создав класс cakebox в этом примере?

Обратите внимание, что реальный код более сложный, чем мой довольно упрощенный пример торта ....! Кроме того, я только что набрал этот пример на своем iPad, поэтому, пожалуйста, простите меня, если есть небольшие ошибки кода - надеюсь, этого достаточно, чтобы преодолеть основные моменты.

Все комментарии или предложения приветствуются

+2

Если ваш код в настоящее время работает, возможно, вам лучше поставил бы этот вопрос на http://codereview.stackexchange.com/ – shuttle87

+0

Да, совершенно нормально создавать класс контейнера, а его базирование на существующем контейнере типичный. Вы даже можете использовать несколько контейнеров как часть класса (например, в этом случае у вас может быть словарь для отслеживания всех тортов с обледенением или нет). Вы можете обновить это при добавлении или удалении торта. Выполнение этого разумно сделает добавление и удаление немного медленнее, но поиск определенных предметов * * быстрее. – kindall

+1

(OT) «ООП или не ООП, то есть вопрос- ли«ТИС благороднее в виду страдать Стропы и стрелы яростной Haters, Или взять в руки оружие против моря классов, И противостоять, положить конец им? " –

ответ

3

Если ваша модель включает в себя то, что называется cakebox и что объект имеет свойства и функциональные возможности, которые сами описаны (и именованные) в вашей модели, и если эта функциональность используется более чем в одном место и - особенно - если в будущем он будет реорганизован, вам будет рекомендовано инкапсулировать сущность в классе с самого начала вашего проекта. Вы можете начать с простой реализации по мере необходимости, но ваш код будет увеличиваться в разборчивости сразу, а рефакторинг в будущем будет намного проще.

+0

Отличный ответ! Я думаю, что я изменю свой текущий код и представим новый класс контейнера.Простая реализация будет действовать на данный момент, но, как вы справедливо говорите, она сделает рефакторинг и добавление новых функций намного проще в будущем. Это также должно сделать код намного проще интерпретировать для других пользователей. – Mark

Смежные вопросы