Как я уже сказал в комментарии, ваш код не использует классы эффективно. Вот то, что я думаю, было бы лучшим подходом, который предлагает большую гибкость в работе над циклической справочной проблемой.
Сначала определения class
(которые следуют PEP 8 правилам именования):
class A:
def __init__(self, value, linked_value=None):
self.y = value
if isinstance(linked_value, B):
self.linked_value = linked_value.x
def print_linked_value(self):
print(self.linked_value)
class B:
def __init__(self, value, linked_value=None):
self.x = value
if isinstance(linked_value, A):
self.linked_value = linked_value.y
def print_linked_value(self):
print(self.linked_value)
Подобные определения предоставляют два способа установки циклических ссылок:
Создавая их отдельно, затем явно связывая их:
# First create instances of each class.
a = A(1)
b = B(42)
# Then link them.
a.linked_value = b.x
b.linked_value = a.y
a.print_linked_value() # -> 42
b.print_linked_value() # -> 1
* ИЛИ *, создав первое без связанного значения и оставив только второе, которое необходимо связать вручную.
# First create instances of each class, but link the second to the first
# when it's created.
a = A(1)
b = B(42, a) # Create and link to first.
# Then link the first to the second to complete the circular references.
a.linked_value = b.x
# Same result.
a.print_linked_value() # -> 42
b.print_linked_value() # -> 1
Заключительное примечание : Еще одна, более продвинутая альтернатива, которая также может применяться в подобных ситуациях, используя встроенную функцию property()
в качестве декоратора для создания "дескрипторы" . Вот ответ на несколько связанный вопрос, иллюстрирующий его использование.