Найти - Пользователи
Полная версия: Вопрос по ООП
Начало » Python для новичков » Вопрос по ООП
1 2 3
Stright
Здравствуйте, начал писать программу, которая производит расчет таблиц для проекта.
Каждая таблица - это отдельный класс (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()
Подскажите, пожалуйста, правильный ли это подход к организации проекта с точки зрения ООП?
Также выслушал бы замечания и критику по самому коду.
FishHook
Каждая таблица - это отдельный класс (Table1, Table2 и т.д.)
правильный ли это подход к организации проекта с точки зрения ООП?
Чем эти две класса у вас отличаются? А ничем! ООП без наследования, это не ООП, это просто немного другой стиль оформления кода в логические модули.
Делайте базовый класс, выносите в него весь общий функционал. Table1 и Table2 должны отличаться принципиально, они должны описывать разные типы сущностей и в их реализации должны остаться атрибуты и методы реализующие эту неодинаковость.
Stright
Извиняюсь, что плохо описал классы Table, общего в этих двух классах будет - только метод read(). process() и write() будут разные во все таблицах. Из-за одного метода создавать общий класс Table и в классах Table1 и Table2 описывать только 2 отличающихся метода?
FishHook
Stright
Из-за одного метода создавать общий класс Table и в классах Table1 и Table2 описывать только 2 отличающихся метода?
Это вы на джаве не писали, видимо.
Stright
process() и write() будут разные во все таблицах

покажите пример реализации write в двух разных таблицах
Rodegast
> класс Project, который при создании экземпляра создает список классов из модуля tables
Он у тебя этот список каждый раз при создании объекта создавать будет. Лучше сделай его атрибутом класса.

> table for table in tables.__dict__
Если у тебя в табличном модуле кроме таблиц ещё что-то будет, то оно тоже в self.lst_tables и self.tables уйдёт.
Сделай базовый класс для таблиц и при загрузки проверяй на него через issubclass.
Stright
FishHook
Это вы на джаве не писали, видимо.
ни на чем больше не писал, и образование и работа с программированием вообще никак не связаны

FishHook
покажите пример реализации write в двух разных таблицах
Таблица 1
Что получается
Таблица 2
Что получается
Одна табличка простая, вторая - посложнее, число строк, после которых будет объединение ячеек, неизвестно, вычисляется в процессе работы функции, в каких-то таблицах проекта будут объединены столбцы и строки одновременно, соответственно и данные будут записываться по-разному.

MiK
FishHook
Чем эти две класса у вас отличаются? А ничем! ООП без наследования, это не ООП, это просто немного другой стиль оформления кода в логические модули.

Ты даёшь
ООП - это по сути и есть немного другой стиль структурирования кода в логические модули.

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

MiK
Та я не буду холиварить.
doza_and
FishHook
где я говорил про множественное наследование
Так тоже неполохая штука множественное наследование. Уж точно логичнее чем наследование и интерфейсы. :)
MiK
Та я не буду холиварить.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB