Дочерний класс наследует Родительский класс self.variable - PullRequest
0 голосов
/ 07 марта 2019

Я не уверен, задавались ли эти вопросы, поскольку не вижу подобных проблем.

Ниже приведены мои вопросы:

class Parent(object):
    def __init__(self,**kwargs):
        self.name = kwargs.get('name',None)
        self.age = kwargs.get('age',None)
        self.year = '1995'
        print(self.name,self.age,self.year)

class Child(Parent):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
        self.parent_name = self.name
        self.parent_age = self.age
        self.parent_year = self.year
        print("Parent Details: ",self.parent_name,self.parent_age,self.parent_year)

>>> res = Parent(name='Derek',age=22)
Derek 22 1994
>>> res2 = Child()
None None 1994

Мой вопрос: почему дочерний класс возвращает None? Я уже использовал super () для наследования родительского класса init. Ниже мои ожидания и как мне этого добиться?

>>> res = Parent(name='Derek',age=22)
Derek 22 1994
>>> res2 = Child()
Parent Details: Derek 22 1994

1 Ответ

1 голос
/ 07 марта 2019

Наследование, грубо говоря, имеет дело с понятиями уровня класса.Рассмотрим этот родительский класс:

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])
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...