Comments 5
А зачем объединять фабрику и базовый класс? Это же убивает весь смысл происходящего.
Базовый класс - это абстракция, контракт описывающий свойства своих наследников. Он о деталях реализации не должен знать ничего.
Фабрика же - это уже конкретная реализация, выдающая конкретные экземпляры конкретных классов.
Ясное дело, что если вы их вместе скрестите, то получится дичь.
В данном случае, думаю, целесообразней применить Builder pattern.
Конструкторы в этих двух классах делают совершенно одно и то же за исключением случая, когда вы явно передаёте None
(но какой смысл передавать в конструктор None ?):
class A:
def __init__(self, repo_type = None):
if repo_type is None:
self.repo_type = 'hg'
class B:
def __init__(self, repo_type = 'hg'):
self.repo_type = repo_type
if __name__=='__main__':
a = A()
b = B()
print(f'a.repo_type: {a.repo_type}, b.repo_type: {b.repo_type}')
a = A(None)
b = B(None)
print(f'a.repo_type: {a.repo_type}, b.repo_type: {b.repo_type}')
python3 test.py
a.repo_type: hg, b.repo_type: hg
a.repo_type: hg, b.repo_type: None
Да согласен, None выглядит не очень хорошо.
Это из-за того, что я пропустил часть кода - у нас часть репозиториев перешла на Git, часть осталась в Mercurial + я добивался того что бы не модифицировать уже имеющиеся скрипты CI/CD.
Полный код выглядит так:
default_repo_type: dict = {
"repo1": "git",
"repo2": "hg",
"repo3": "hg",
}
........
if repo_type is None:
repo_type = default_repo_type.get(name)
........
Python: класс Factory, возвращающий собственных наследников