Я нахожусь в процессе изучения 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