Задать вопрос
usgleb
@usgleb

Удобное расширение функционала класса

Пишу на Python. Столкнулся с такой задачей — существует класс для работы с базой данных. У него есть некие функции. Одна получает первые 50 записей, вторая сохраняет запись и возвращает какой-то параметр, третья получает запись и т.п. Для работы я создаю 1 экземпляр этого класса и устанавливаю ссылку на него во всех объектах, а они по ссылке обращаются к этому классу и так получают доступ к его функциям.

class DB():
    def __init__(self):
        #Какие-то настройки для создания соединения с БД

    def createConnection(self):
        #Создание соединения
        self.connection = new Connection(param1, param2, param3)

    def get50Records(self):
        #Получение 50 записей
        result = self.conncetion.select(TABLE_RECORDS, limit=50)
        return result

    def saveRecords(self, params):
        pass

     ....



В чем проблема — когда я хочу добавить новую функцию в класс DB, мне приходиться дописывать ее в сам класс. То есть как бы изменять его. А это не хочется делать. Нужен какой-то удобный способ добавлять новый функционал.

Я придумал вот такое. Я создаю один класс DB, в котором есть только параметры для создания соединения и сама функцию создания соединения. Далее я создаю новый класс называю его, например, DBget50Records и там функционал функции get50Records. А класс DB я наследую от класса DBget50Records. То есть, получается, что DBget50Records — родитель и у класса DB есть весь функционал, что и у родителя. Поэтому я, так же, создаю 1 экземпляр класса DB и все объектам передаю ссылку на него. А если мне надо расширить функционал, то я создаю новый класс DBsaveRecords и добавляю его в родители класса DB.

class DBget50Records():

    def get50Records(self):
        #Получение 50 записей
        result = self.conncetion.select(TABLE_RECORDS, limit=50)
        return result

class DBsaveRecords():

    def saveRecords(self, params):
        pass

class DB(DBget50Records, DBsaveRecords):
    def __init__(self):
        #Какие-то настройки для создания соединения с БД

    def createConnection(self):
        #Создание соединения
        self.connection = new Connection(param1, param2, param3)


Что вы думаете по этому поводу? Я понимаю, что все ровно придется менять класс DB добавляя ему родителей, но пока что ничего интереснее не придумал. Паттерн Декоратор не подходит!
  • Вопрос задан
  • 2889 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
simplecode
@simplecode
Я бы Буча на Вашем месте почитал…
Зачем такие сложности?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы