Наследование, грубо говоря, имеет дело с понятиями уровня класса.Рассмотрим этот родительский класс:
class Parent(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.year = '1995'
def eat(self, food):
print("I ate {}".format(food))
Теперь рассмотрим этот дочерний класс:
class Child(Parent):
def __init__(self, name, age, p):
super().__init__(name, age)
self.parent_name = p.name
self.parent_age = p.age
self.parent_year = p.year
# Or, since you can already access the name, age, and year of
# an instance of Parent, just save the instance directly:
self.parent = p
Тогда вы могли бы написать
p = Parent("Derek", 22)
c = Child("Didi", 9, p)
Now c.parent_name == "Derek"
и c.parent_age == 22
, но c.name == "Didi"
и c.age == 9
.Вы явно сказали Child
, кто был родителем Диди;наследование не участвует.(Наследование участвует в установке атрибутов name
и age
, так как вы вызываете super().__init__
, но это довольно странная иерархия классов. Child
является дочерним классом Parent
, но это не очень хорошо моделирует реальный мир: не все дети являются родителями.)
Суть наследования - метод eat
.Не существует метода Child.eat
, поэтому при вызове c.eat("apple")
происходит Parent.eat
, вызываемый с экземпляром Child
в качестве первого аргумента.
>>> p.eat("apple")
"I ate apple"
>>> c.eat("apple")
"I ate apple"
Наследование должно бытьиспользуется для моделирования отношений "is-a";если B
наследуется от A
, то для всех намерений и целей экземпляр B
должен использоваться везде, где можно использовать экземпляр A
.Ваше использование здесь нарушает это;Child
имеет родителя, но не обязательно сам родитель, поэтому Child
не должно наследоваться от Parent
.Более разумное моделирование будет включать только один класс:
class Person:
def __init__(self, name, age, parents=None):
self.name = name
self.age = age
self.parents = parents
# We've lost the genealogical records, and don't know who
# Bob and Alice's parents were.
first_man = Person("Alice", 25)
first_woman = Person("Bob", 25)
children = [
Person("Charlie", 15, [first_man, first_woman]),
Person("Derek", 13, [first_man, first_woman])
]