У меня есть скрипт Python, содержащий следующий код:

class Parent:
    def __init__(self, name):
        self.name = name

    class Child:
        def __init__(self, name):
            self.name = name

    def print_relationship(self):
        print(f'{self.name} is {self.Child.name}\'s parent')


myObj_1 = Parent('John')
myObj_1.Child.name = 'Steve'

myObj_2 = Parent('Stan')
myObj_2.Child.name = 'Oliver'

myObj_1.print_relationship()
myObj_2.print_relationship()

Который возвращает:

>>> Джон - родитель Оливера

>>> Стэн - родитель Оливера

Но я ожидаю следующих результатов:

>>> Джон - родитель Стива

>>> Стэн - родитель Оливера

Это проблема наследования? Плохой дизайн? Обе?

-edit- Плохой дизайн был ответом.

0
gbeaven 3 Янв 2020 в 21:26

2 ответа

Класс Child представляет детей в целом. Определите это глобально. Каждый экземпляр Parent должен хранить ссылку на экземпляр из Child. (Этот экземпляр может быть не уникальным; у ребенка может быть несколько родителей.)

class Child:
    def __init__(self, name):
        self.name = name

class Parent:
    def __init__(self, name, child=None):
        self.name = name
        self.child = child

    def print_relationship(self):
        print(f'{self.name} is {self.child.name}\'s parent')


oliver = Child('Oliver')
myObj_1 = Parent('John', Child('Steve'))
myObj_2 = Parent('Stan', oliver)
myObj_3 = Parent('Jane', oliver)

myObj_1.print_relationship()
myObj_2.print_relationship()

Конечно, у родителя может быть несколько детей:

class Parent:
    def __init__(self, name, children=None):
        self.name = name
        if children is None:
            children = []
        self.children = children

    def print_relationship(self):
        for child in self.children:
            print(f'{self.name} is {child.name}\'s parent')


myObj1 = Parent('Bob', [Child('Alice'), Child('Chloe')])
1
chepner 3 Янв 2020 в 18:47

В строке myObj_1.Child.name = 'Steve' вы создаете атрибут класса name в классе Child и присваиваете значение Steve. Это имя отличается от атрибута экземпляра в строке self.name = name, к которому может получить доступ только экземпляр класса Child.

Когда выполняется myObj_2.Child.name = 'Oliver', значение атрибута класса name класса Child изменяется.

В print_relationship вы ссылаетесь на self.Child.name, который ссылается на атрибут класса name дочернего класса.

0
Shashank V 3 Янв 2020 в 18:36