Вопрос по паттерну "Стратегия" на Python
День добрый! Поставлена следующая задача:
Используя паттерн "Стратегия", спроектировать и реализовать приложение, обладающее следующим функционалом:
- Загрузка данных из текстового файла. Данные представляют собой целые числа, каждое число записано в отдельной строке файла.
- Хранение данных в памяти. Данные хранятся в cписке из 100 элементов. Если в файле элементов больше, загружаются первые 100, остальные игнорируются.
- Фильтрация данных. Выбрать только числа >10.
- Вывод отфильтрованных данных на экран. Данные выводятся в консоль.
В дальнейшем может потребоваться реализация дополнительного функционала:
- Чтение данных из бинарного файла
- Запрос данных у пользователя в интерактивном режиме
- Запрос данных по локальной сети
- Хранение данных не в массиве, а в динамической структуре, например в списке
- Дополнительные фильтры
- Вывод на экран с помощью графического интерфейса
- Другой подобный функционал
Насколько я понял, необходимо реализовать четыре "иерархии" (чтение, хранение, фильтрация и вывод, соответственно). Для этого в классе 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
Отсюда вопрос, как можно ее можно обойти и не переопределять в конкретных стратегиях абстрактные методы, которые в них не применяются ?