Как атрибуты из разных объектов могут ссылаться друг на друга

Я пытаюсь выяснить, как определенные атрибуты объекта могут ссылаться на атрибуты другого объекта. Например, у меня есть объект с именем «A»и дети [«B»,»C»]. У меня также есть ребенок B с именем «B»и дети [«D»,»E»]. Теперь я хочу, чтобы они имели Родительский атрибут. Есть ли способ для B и C автоматически знать, что их родительский атрибут-A… и для D и E, чтобы знать, что это B. см. ниже:

class FamilyTree:
    def __init__(self, name, children, parent):
        self.name = name 
        self.child = child

I don’t want to next do:

self.parent = parent

Я хочу, чтобы B знал, что его родительским атрибутом является A.

2 ответа

  1. Родитель должен быть установлен явно где-то. Если вы не хотите устанавливать его в ребенка, вы можете сделать это:

    class FamilyTree:
        def __init__(self, name, children):
            self.name = name 
            self.children = children
            for child in children:
                child.parent = self
    
  2. Вы можете это сделать, но, во-первых, вы должны отслеживать экземпляры и создавать дополнительное хранилище, во-вторых, ваше имя ребенка должно быть уникальным (если у обоих «Dad_1» и «Dad_2» есть сын с именем «Джон», как вы узнаете, чей «Джон» это). И, конечно, экземпляр parent должен существовать до создания экземпляра son.

    class FamilyTree(object):
        instances = []
    
        def __init__(self, name, children=None):
            self.name = name 
            self.child = children
            for inst in FamilyTree.instances: # Dad finder
                if inst.child:
                    if self.name in inst.child:
                        self.parent = inst.name
            FamilyTree.instances.append(self) # Add instance to storage
    
    dad = FamilyTree('Dad', ['Son', 'Daughter'])
    son = FamilyTree('Son', ['Son_of_Son', 'Daughter_of_Son'])
    son.parent
    
    Out[297]: 'Dad'
    

    Могут быть и другие решения с использованием декораторов или MetaCalsses. Это самое очевидное.