杂交遗传

2024-05-20 01:51:56 发布

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

试图找出导致错误的原因时卡住了: TypeError:init()接受4个位置参数,但给出了5个 感谢您的帮助

# Parent class
class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
# Child class
class Labrador(Dog):
    def __init__(self, name, age, playfulness):
        super().__init__(name, age)
        self.playfulness = playfulness
# Child class
class Poodle(Dog):
    def __init__(self, name, age, potty_trained):
        super().__init__(name, age)
        self.potty_trained = potty_trained
# Grandchild class
class Labradoodle(Labrador,Poodle):
    def __init__(self, name, age, playfulness, potty_trained):
        super().__init__(name, age, playfulness, potty_trained)

dogo2 = Labradoodle("Dookie", 2, 'Very playful', 'Yes')

print(dogo2.playfulness, dogo2.potty_trained)

Tags: nameselfchildageinitdefclasssuper
2条回答

这不是多重继承的工作方式:您必须遵循MRO,才能知道您实际上指的是哪个基类

在本例中,super()正在调用Labrador的构造函数,这仅仅是因为它在Labradoodle的定义中列在第一位,所以您必须满足它的要求(3个参数)

此外,您在那里实现的是一种称为菱形继承树的反模式,这是一种非常不明智的做法,因为它会导致许多继承歧义。通常,至少在可能的情况下,更喜欢组合而不是多重继承

然而,在这种情况下,构图不太合适;我认为这里最好的解决方案是从Dog派生出Labradoodle,并添加playfulnesspotty_trained作为实例变量

这里的问题是,在拉布拉多调用super().__init__的参数比应该的多。正在调用的__init__Labrador之一,它只包含3个参数

您可以在这里阅读更多关于在这些情况下调用什么的内容:Calling parent class __init__ with multiple inheritance, what's the right way?

相关问题 更多 >