У меня есть класс, который представляет человека в семье (FamilyMember).
Я реализовал функцию setParent
, которая получает объект FamilyMember и добавляет его в список parent
текущего объекта. ,Точно то же самое делается в функции setChild
.
Проблема : когда одна функция вызывает другую (если мы устанавливаем родителя нашего текущего объекта, мы должны также установить текущийОбъект, как родительский ребенок), они входят в цикл. => Мне удалось остановить его, проверяя, был ли объект уже в списке. Но это означает, что я всегда выполняю ненужный вызов функции.
def setParent(self, parent):
if not isinstance(parent, FamilyMember):
raise TypeError("Parent must be set to a FamilyMember")
if parent in self.parents:
print("parent already in the list")
return
self.parents.append(parent)
parent.setChild(self)
def setChild(self, child):
if not isinstance(child, FamilyMember):
raise TypeError("child must be set to a FamilyMember")
if child in self.children:
print("child already in the list")
return
self.children.append(child)
child.setParent(self)
Возможное решение, которое мне не нравится : я мог бы сделать еще 2 функции, которые делают то же самое, но не делаютвызовите другую функцию. Но это означает повторение кода и наличие 4 различных функций, что не является хорошей практикой. пример:
def setParent_no_loop(self, parent):
if not isinstance(parent, FamilyMember):
raise TypeError("Parent must be set to a FamilyMember")
if parent in self.parents:
print("parent already in the list")
return
self.parents.append(parent)
def setChild(self, child):
if not isinstance(child, FamilyMember):
raise TypeError("child must be set to a FamilyMember")
if child in self.children:
print("child already in the list")
return
self.children.append(child)
self.setParent_no_loop(self)
Возможное решение, которое мне не нравится : я переписываю код из другой функции в обе функции. Что, опять же, переписывает код, и это не очень элегантно:
def setParent_no_loop(self, parent):
if not isinstance(parent, FamilyMember):
raise TypeError("Parent must be set to a FamilyMember")
if parent in self.parents:
print("parent already in the list")
return
self.parents.append(parent)
parent.children.append(self)
Вопрос в том, можете ли вы найти элегантный способ решения этой проблемы?