Фабрика Питона и Избежание Кругового Импорта - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть фабрика Python в двух файлах. Вызов фабричного метода приводит к этой ошибке: ImportError: cannot import name 'SsnValidator'. Я полагаю, что это связано с круговым импортом, и есть другие вопросы о круговом импорте.

Разница в том, что на фабрике базовый класс должен знать о подклассах, а подклассы должны знать о базовом классе. Как это сделать?

В производстве имеется несколько больших подклассов, поэтому размещение подклассов в одном и том же файле .PY в качестве базового класса не является предпочтительным вариантом.

Файлы

\subdir\validator_base.py

\subdir\validator_ssn.py

validator_base.py

from subdir.validator_ssn import SsnValidator

class Validator():
    def __init__(self, dig_pred):
        pass

    # factory method
    @classmethod
    def create_validator(cls, target):
        if target == 'ssn':
            return SsnValidator()
        else:
            pass


if __name__ == '__main__':
    validator = Validator.create_validator('ssn')

validator_ssn.py

from subdir.validator_base import Validator

class SsnValidator(Validator):
    def __init__(self):
        pass

** Edit **

Я могу обойти эту проблему, поместив фабричный метод create_validator в новый класс втретий файл. Однако этот подход не следует обычному шаблону помещения фабричного метода в базовый класс.

Третий файл выглядит следующим образом:

Файлы

\subdir\validator_selector.py

from subdir.validator_ssn import SsnValidator

class ValidatorSelector:
    # factory
    @classmethod
    def create_validator(self, target):
        if target == 'ssn':
            return SsnValidator()
        else:
            pass

if __name__ == '__main__':
    validator = ValidatorSelector.create_validator('ssn')

Модуль, содержащий базовый классне содержит импорта, и каждый модуль, содержащий подкласс, импортирует только базовый класс.

...