Python, Список детей

#python #list #instance #python-3.8

#питон #Список #пример #python-3.8

Вопрос:

Я хочу создать родительскую/дочернюю структуру данных в Python 3.8.10. [GCC 9.3.0] в Linux код так же прост, как:

 class Member(object):  name = "xxx"  parent = None  children = []    def __init__(self, name):  object.__init__(self)  self.name = name    def setParent(self,p):  self.parent = p    def addChild(self,ch):  self.children.append(ch)  ch.setParent(self)    def myRelatives(self):  str = "I am {0}, my parent is {1} my children are:".format(self.name,self.parent.name if self.parent is not None else "--")  print(str)   for ch in self.children:  print(" {0}".format(ch.name))    if __name__ == '__main__':  A = Member("A")  B = Member("B")  C = Member("C")  D = Member("D")    A.addChild(B)  B.addChild(C)  C.addChild(D)    A.myRelatives()  B.myRelatives()  C.myRelatives()  D.myRelatives()  

Я ожидал:

 I am A, my parent is -- my children are:  B I am B, my parent is A my children are:  C I am C, my parent is B my children are:  D I am D, my parent is C my children are:  

Однако мой результат таков:

 I am A, my parent is -- my children are:  B  C  D I am B, my parent is A my children are:  B  C  D I am C, my parent is B my children are:  B  C  D I am D, my parent is C my children are:  B  C  D  

Похоже, что «self.children» используется как одна и та же переменная во всех случаях. Почему и как это исправить?

Спасибо, Бернд

Комментарии:

1. self.children относится к переменной класса Member.children , которую вы должны определить self.children , __init__ чтобы создать переменную экземпляра.

Ответ №1:

Вам нужно установить атрибуты name , parent , и children в __init__ функции, например, так:

 def __init__(self, name):  super().__init__(self)  self.name = name  self.parent = None  self.children = list()   

Тогда это должно сработать.

ПРАВКА: Добавлено улучшение, предложенное @chepner.

Комментарии:

1. Предпочитайте super().__init__() object.__init__(self) это делать, если у вас нет веских причин нарушать совместное наследование.

2. Спасибо тебе, Морис, FlyingDutchman amp; Chepner. Это работает. Я немного смущен, почему в исходном примере для переменной ‘Member.parent’ сработало то, что каждый экземпляр имел свое собственное значение, но не работал для «Детей»