Свойство дочернего экземпляра Python переопределяется родительским свойством - PullRequest
0 голосов
/ 04 июля 2019

Я нахожусь в процессе изучения Python 3 и пишу концептуальные фрагменты кода, чтобы помочь моему пониманию.Я столкнулся с проблемой в простом примере наследования классов, где переменная экземпляра из дочернего класса, кажется, переопределяется родительской переменной.

Я поиграл со следующим кодом в различных формах и упростил его дляцель этого вопроса.Я не могу понять, почему собственный метод __str__() объекта Child ссылается на свойство name Parent, когда я использую self.name внутри класса Child для ссылки на свойство name объекта Child (этокак если бы self.name было заменено на super().name).

class Parent():

    """ Parent class that will take a name or default to 'Default Parent'.
    """

    def __init__(self, name="Default Parent"):
        self.name = name

    def __str__(self):
        return f'Parent: I am {self.name}'

class Child(Parent):

    """ Child class inheriting from Parent class
    """

    def __init__(self, name="Default Child"):
        # setting self.name to the name passed in during Child instantiation
        self.name = name
        # not passing self.name so parents's self.name will be defaulted to "Default Parent"
        super().__init__() 

    def __str__(self):
        # self.name prints "Default Parent"
        # The property self.name in Child appears to be overridden.
        # Thought self.name here refers to the instant variable belonging to the instance of Child and not super().name.
        return f'Child: I am {self.name}'

Я проверил это следующим образом:

p1 = Parent("Parent 1")
c1 = Child("Child 1")
print(p1)
print(c1)

Я ожидал эти результаты обратно:

Parent: I am Parent 1
Child: I am Child 1

Вместо этого я получил обратно:

Parent: I am Parent 1
Child: I am Default Parent

1 Ответ

1 голос
/ 04 июля 2019

Вы звоните super().__init__() после того, как вы установили self.name в Child.Это переписывает свойство.Вместо этого передайте параметр name родительскому init.

class Child(Parent):

    """ Child class inheriting from Parent class
    """

    def __init__(self, name="Default Child"):
        super().__init__(name=name) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...