Я ожидал, что кто-то более осведомлен, чтобы ответить на этот вопрос, но так как этого еще не произошло, я брошу свои центы в два цента. Я попытаюсь обратиться к техническому аспекту такого дизайна и оставить сцену для анализа более высокого уровня для профессионалов.
Я думаю, что это действительно не очень хорошая практика. Родительские классы не должны знать о дочерних классах по ряду причин, но в первую очередь это затрудняет дальнейшее расширение модуля. Всякий раз, когда новый дочерний класс подклассифицирует родительский класс (или один из его дочерних элементов), он, вероятно, также требует обновления родительского класса. В Python
он заставляет все будущие дочерние классы определяться в том же файле, чтобы избежать циклического импорта. Хотя обе эти проблемы можно обойти, это просто кажется ненужной проблемой.
Кроме того, поскольку указанный метод наследуется в дочерних классах, то, если он не переопределен, он вызывает своеобразное знакомство между классами «брат», что может быть нежелательным.
Хотя я уверен, что существуют определенные ситуации, когда для родительского класса было бы полезно знать его дочерние классы, я думаю, что в целом такие ситуации вызывают ошибку в дизайне и альтернативное решение, t следует использовать такой интроспективный подход.
Обратите внимание, что это не означает, что родительские объекты не должны знать о дочерних объектах. Дочерние объекты, как и любой другой объект, могут быть законно получены в качестве аргументов для работы в родительских методах. Родитель может даже рассматривать их как родительские объекты, поскольку дочерний объект также является родительским объектом, и это один из основных пунктов ООП.
Что касается вашего конкретного примера, это может быть достигнуто с помощью factory design pattern. Нет необходимости, чтобы создаваемые объекты были того же экземпляра, что и их создатель. Например:
class factory(object):
def __init__(self, attr):
self.attr = attr
def create(self, typ)
if typ == 'a':
return ChildA(self.attr)
else:
return ChildB(self.attr)
class Parent(object):
def __init__(self, attr):
self.attr = attr
class ChildA(Parent):
pass
class ChildB(Parent):
pass
Разве это не вопрос? Нам неизвестны мнения о переполнении стека. – Veedrac
Я думал, что вопросы о том, «что такое хорошая практика», относительно дизайна программного обеспечения, приемлемы. Ищите «хорошую практику» в SO, и вы найдете довольно много высоко разрешенных вопросов, даже если не всегда ясно, что есть окончательный ответ. – Bach
Большинство из них находятся в «старом» переполнении стека, и большинство (должно) были закрыты. – Veedrac