Имеет ли смысл эта схема интерфейса, реализации, фабрики в Python ABC?

У меня есть приложение Django и очередь сообщений, и я хочу иметь возможность легко переключаться между службами очередей (SQS или RabbitMQ, например).

Итак, я установил BaseQueue "интерфейс":

class BaseQueue(ABC):
    @abstractmethod
    def send_message(self, queue_name, message, message_attributes=None):
        pass

И два конкретных класса, которые наследуются от BaseQueue:

class SqsQueue(BaseQueue):
    def send_message(self, queue_name, message, message_attributes=None):
        # code to send message to SQS

class RabbitMqQueue(BaseQueue):
    def send_message(self, queue_name, message, message_attributes=None):
        # code to send message to RabbitMQ

Затем в settings.py у меня есть значение, указывающее на реализацию, которую приложение должно использовать:

QUEUE_SERVICE_CLS = "queues.sqs_queue.SqsQueue"

Поскольку это приложение Django, оно находится в settings.py, но это значение может быть откуда угодно. Оно просто говорит, где находится класс.

Тогда у меня есть QueueFactory, задача которого - вернуть сервис очереди для использования:

class QueueFactory:
    @staticmethod
    def default():
        return import_string(settings.QUEUE_SERVICE_CLS)()

Фабрика импортирует класс и инстанцирует его.

Я бы использовал его следующим образом:

QueueFactory.default().send_message(queue_name, message)

Это работает, но мне интересно, есть ли более Python способ сделать это? Например, с помощью каких-нибудь магических методов?

Вернуться на верх