Python类型中的继承

2024-04-23 08:29:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图学习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())

我也不明白为什么父.lastName应该工作(根据我读到的)。Parent是一个类,那么它为什么要访问实例的lastName呢? 我真正想要的是孩子继承父母的姓,而不是名。你知道吗


Tags: nameselfchild示例getinitdef错误
2条回答

孩子不一定是父母,而是父母。此外,名称不应该硬编码在__init__方法中,而是作为参数传递。不是每个ChildPerson的实例都具有相同的名称(尽管在这个简单的示例中,子实例将共享其父实例的姓氏)。你知道吗

(我将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())

c = Child(p)是一个错误:除了self隐式参数外,构造函数不接受任何参数。你知道吗

您不需要复制lastName,因为Child继承自Parent。但是由于您在Child中定义了__init__,因此您也必须为此调用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())

印刷品:

Moritz Mustermann

调用我们使用的父__init__方法

Parent.__init__(self)

我们也可以这样使用super

super(Child,self).__init__()

这和这里的情况(单一继承)是一样的,所以就像:

super().__init__()

相关问题 更多 >