У меня есть фабрика 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')
Модуль, содержащий базовый классне содержит импорта, и каждый модуль, содержащий подкласс, импортирует только базовый класс.