Форум сайта python.su
16
Здравствуйте, начал писать программу, которая производит расчет таблиц для проекта.
Каждая таблица - это отдельный класс (Table1, Table2 и т.д.), экземпляры которого обладают методами read(), process() и write(), все таблицы в отдельном модуле tables.
Во втором модуле project - класс Project, который при создании экземпляра создает список классов из модуля tables и рассчитывает выбранные пользователем таблицы.
# tables.py class Table1: def read(self): print('Читаем данные для таблицы 1') def process(self): print('Обрабатываем данные для таблицы 1') def write(self): print('Записываем данные таблицы 1') class Table2: def read(self): print('Читаем данные для таблицы 2') def process(self): print('Обрабатываем данные для таблицы 2') def write(self): print('Записываем данные таблицы 2')
# project.py import tables class Project: def __init__(self): self.lst_tables = sorted([table for table in tables.__dict__ if not table.startswith('__')]) self.tables = [tables.__dict__[key] for item in self.lst_tables for key in tables.__dict__ if item == key] self.choice_dict = {'0': self.tables} for num, table in enumerate(self.tables): self.choice_dict[str(num + 1)] = table def select_table(self): print('Введите через запятую, какие таблицы считать?') for key in sorted(self.choice_dict): if key == '0': print('\t{} => {}'.format(key, 'все таблицы')) else: print('\t{} => {}'.format(key, self.choice_dict[key].__name__)) self.selected_tables = sorted([num.strip() for num in input().split(',')]) self.selected_tables = [num for num in self.selected_tables if num.isdigit()] def calculate(self): for table in self.selected_tables: if isinstance(self.choice_dict.get(table), list): for cls in self.choice_dict.get(table): inst = cls() inst.read() inst.process() inst.write() break else: inst = self.choice_dict.get(table)() inst.read() inst.process() inst.write() if __name__ == '__main__': x = Project() x.select_table() x.calculate()
Отредактировано Stright (Июль 31, 2015 15:33:28)
Офлайн
568
Каждая таблица - это отдельный класс (Table1, Table2 и т.д.)
правильный ли это подход к организации проекта с точки зрения ООП?Чем эти две класса у вас отличаются? А ничем! ООП без наследования, это не ООП, это просто немного другой стиль оформления кода в логические модули.
Отредактировано FishHook (Июль 31, 2015 15:34:39)
Офлайн
16
Извиняюсь, что плохо описал классы Table, общего в этих двух классах будет - только метод read(). process() и write() будут разные во все таблицах. Из-за одного метода создавать общий класс Table и в классах Table1 и Table2 описывать только 2 отличающихся метода?
Отредактировано Stright (Июль 31, 2015 15:45:40)
Офлайн
568
StrightЭто вы на джаве не писали, видимо.
Из-за одного метода создавать общий класс Table и в классах Table1 и Table2 описывать только 2 отличающихся метода?

Stright
process() и write() будут разные во все таблицах
Офлайн
186
> класс Project, который при создании экземпляра создает список классов из модуля tables
Он у тебя этот список каждый раз при создании объекта создавать будет. Лучше сделай его атрибутом класса.
> table for table in tables.__dict__
Если у тебя в табличном модуле кроме таблиц ещё что-то будет, то оно тоже в self.lst_tables и self.tables уйдёт.
Сделай базовый класс для таблиц и при загрузки проверяй на него через issubclass.
Отредактировано Rodegast (Июль 31, 2015 16:48:55)
Офлайн
16
FishHookни на чем больше не писал, и образование и работа с программированием вообще никак не связаны
Это вы на джаве не писали, видимо.

FishHookТаблица 1
покажите пример реализации write в двух разных таблицах
Офлайн
-1
FishHook
Чем эти две класса у вас отличаются? А ничем! ООП без наследования, это не ООП, это просто немного другой стиль оформления кода в логические модули.

Офлайн
568
MiK, не умничай, у тебя не получается
>>>К тому же не все языки поддерживают наследование
Ты знаешь объектно-ориентированные языки программирования без наследования? Примеры в студию!
>>>множественное наследование порождает множество ошибок
покажи пальцем, где я говорил про множественное наследование
>>>Вообщем, есть и другие принципы, кроме как наследоваться.
Посмотри в любой профессиональный проект на питоне. Например в код джанги или sqlalchemy и покажи мне любой вменяемый проект построенный на “других принципах”.
>>>ООП - это по сути и есть немного другой стиль структурирования кода в логические модули.
ООП - это парадигма программирования.
Паради́гма программи́рования — это совокупность идей и понятий, определяющих стиль написания компьютерных программ (подход к программированию). Это способ концептуализации, определяющий организацию вычислений и структурирование работы, выполняемой компьютером.
Отредактировано FishHook (Авг. 1, 2015 10:22:22)
Офлайн
-1
Та я не буду холиварить.
Офлайн
253
FishHookТак тоже неполохая штука множественное наследование. Уж точно логичнее чем наследование и интерфейсы. :)
где я говорил про множественное наследование
MiK
Та я не буду холиварить.
Офлайн