#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’ сработало то, что каждый экземпляр имел свое собственное значение, но не работал для «Детей»