Наследование в Python - TypeError - PullRequest
0 голосов
/ 15 февраля 2019

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

TypeError: __init__() takes 1 positional argument but 2 were given

Код:

class Parent:
    def __init__(self):
        self.lastName = "Mustermann" 
        self.firstName = "Max"
    def get_name(self):
        return self.firstName+" "+self.lastName 
class Child(Parent):
    def __init__(self):
        self.firstName = "Moritz"
        self.lastName=Parent.lastName
p=Parent()
c = Child(p)
print(c.get_name())

Я также не понимаю, почему Parent.lastName должен работать (в соответствии с тем, что я прочитал).Parent - это класс, так зачем ему обращаться к lastName экземпляра?Что я действительно хочу, так это чтобы Child наследовал lastName Parent, но не firstName.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Ребенок не является (обязательно) родителем, у него есть родитель.Кроме того, имена не должны быть жестко закодированы в методе __init__, а должны передаваться как аргументы.Не каждый экземпляр Child или Person будет иметь одинаковые имена (хотя в этом простом примере ребенок будет использовать фамилию своего родителя).

(я изменил Parent на Person с тех порв классе Parent нет ничего особенно похожего на родителя. У Child все еще есть Person в качестве родителя.)

class Person:
    def __init__(self, firstName, lastName):
        self.lastName = firstName
        self.firstName = lastName

    def get_name(self):
        return self.firstName+" "+self.lastName 


class Child(Person):
    def __init__(self, firstName, parent):
        super().__init__(firstName, parent.lastName)
        self.parent = parent

p = Person("Max", "Mustermann")
c = Child("Moritz", p)
print(c.get_name())
0 голосов
/ 15 февраля 2019

c = Child(p) - ошибка: конструктор не принимает никаких аргументов, кроме неявного self.

Вам не нужно копировать lastName, поскольку Child наследуется от Parent.Но так как вы определили __init__ в Child, для этого необходимо также вызвать метод Parent __init__ (иначе родительский конструктор не вызывается):

class Parent:
    def __init__(self):
        self.lastName = "Mustermann"
        self.firstName = "Max"
    def get_name(self):
        return self.firstName+" "+self.lastName
class Child(Parent):
    def __init__(self):
        Parent.__init__(self)
        self.firstName = "Moritz"

p=Parent()
c = Child()
print(c.get_name())

print:

Moritz Mustermann

Чтобы вызвать родительский метод __init__, который мы использовали

Parent.__init__(self)

, мы могли бы также использовать super следующим образом:

super(Child,self).__init__()

, что равновещь здесь (одиночное наследование), так что даже как:

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