Создание суперкласса перед вызовом фабричного метода - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь инициализировать суперкласс перед вызовом подкласса.Вот пример того, что я пытаюсь сделать:

class AbstractSourceParser(object):

    def __init__(self, filepath):

        self.source_type = get_type_from_filepath(filepath)

    @staticmethod
    def factory(source_type):

        source_type = source_type.upper() if source_type else None

        if source_type == SourceType.CSV.upper():
            return CSVSourceParser() 

class CSVSourceParser(AbstractSourceParser):
    ...

И тогда я хочу иметь возможность назвать это так:

parser = AbstractSourceParser("/tmp/file.csv").factory(self.type)

Я думаю, что янаписанное выше не имеет смысла в коде, но в основном я хочу получить фабричный метод «после», передавая некоторые данные суперклассу.Как бы это было сделано?

В настоящее время я делаю следующее, что мне кажется довольно уродливым (если не неправильным) -

>>> _parser = AbstractSourceParser("/tmp/file.csv")
>>> parser = _parser.factory(_parser.source_type) 

1 Ответ

0 голосов
/ 16 февраля 2019

Вы можете сделать factory() обычным методом экземпляра и позволить ему выполнить работу:

class AbstractSourceParser(object):
    def __init__(self, filepath):
        self.source_type = get_type_from_filepath(filepath)

    def factory(self, source_type=None):
        if source_type is None:
            source_type = self.source_type

        source_type = source_type.upper() if source_type else None

        if source_type == SourceType.CSV.upper():
            return CSVSourceParser()

Так что, если вы хотите, чтобы тип источника был определен в родительском конструкторе, вы можете вызвать factory()без аргументов.Но вы все равно можете указать другое значение source_type, если хотите.

Получает ли это то, о чем вы спрашиваете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...