Вопрос по паттерну "Стратегия" на Python

День добрый! Поставлена следующая задача:

Используя паттерн "Стратегия", спроектировать и реализовать приложение, обладающее следующим функционалом:

  1. Загрузка данных из текстового файла. Данные представляют собой целые числа, каждое число записано в отдельной строке файла.
  2. Хранение данных в памяти. Данные хранятся в cписке из 100 элементов. Если в файле элементов больше, загружаются первые 100, остальные игнорируются.
  3. Фильтрация данных. Выбрать только числа >10.
  4. Вывод отфильтрованных данных на экран. Данные выводятся в консоль.

В дальнейшем может потребоваться реализация дополнительного функционала:

  1. Чтение данных из бинарного файла
  2. Запрос данных у пользователя в интерактивном режиме
  3. Запрос данных по локальной сети
  4. Хранение данных не в массиве, а в динамической структуре, например в списке
  5. Дополнительные фильтры
  6. Вывод на экран с помощью графического интерфейса
  7. Другой подобный функционал

Насколько я понял, необходимо реализовать четыре "иерархии" (чтение, хранение, фильтрация и вывод, соответственно). Для этого в классе Strategy я создал 4 абстрактных метода, которые затем будут переопределены при реализации конкретных стратегий.

Получился следующий код, в котором были реализованы четыре базовые стратегии (чтение из файла, хранение данных в списке и т.д.), определенные в дано:

from __future__ import annotations
from abc import ABC, abstractmethod

class Context():

    def __init__(self, strategy: Strategy):
        self._strategy = strategy

    @property
    def strategy(self):
        return self._strategy

    @strategy.setter
    def strategy(self, strategy: Strategy):
        self._strategy = strategy

class Strategy(ABC):

    @abstractmethod
    def read(self, filename):
        pass
 
    @abstractmethod
    def keep(self, data):
        pass
    
    @abstractmethod
    def filters(self, data):
        pass
    
    @abstractmethod
    def prints(self, data):
        pass    

class ReadFile(Strategy):  
    def read(self, filename):
        res = open(filename, "r+")
        return res

class KeepList(Strategy):  
    def keep(self, data):
        res = [int(next(data)) for i in range(100)]
        return res

class FilterList(Strategy):
    def filters(self, data):
        res = [i for i in data if i > 10]
        return res

class BasicPrint(Strategy):
    def prints(self, data):
        for elems in data:
            print(elems)
        

Однако тут я столкнулся с проблемой. Т.к. в классе ReadFile (и остальных классах-стратегиях) не переопределены другие, неиспользуемые абстрактные методы, при выполнении программы появляется ошибка:

TypeError: Can't instantiate abstract class ReadFile with abstract methods filters, keep, prints

Отсюда вопрос, как можно ее можно обойти и не переопределять в конкретных стратегиях абстрактные методы, которые в них не применяются ?


Ответы (0 шт):