试图找出导致错误的原因时卡住了: 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)
这不是多重继承的工作方式:您必须遵循MRO,才能知道您实际上指的是哪个基类
在本例中,
super()
正在调用Labrador
的构造函数,这仅仅是因为它在Labradoodle
的定义中列在第一位,所以您必须满足它的要求(3个参数)此外,您在那里实现的是一种称为菱形继承树的反模式,这是一种非常不明智的做法,因为它会导致许多继承歧义。通常,至少在可能的情况下,更喜欢组合而不是多重继承
然而,在这种情况下,构图不太合适;我认为这里最好的解决方案是从
Dog
派生出Labradoodle
,并添加playfulness
和potty_trained
作为实例变量这里的问题是,在拉布拉多调用
super().__init__
的参数比应该的多。正在调用的__init__
是Labrador
之一,它只包含3个参数您可以在这里阅读更多关于在这些情况下调用什么的内容:Calling parent class __init__ with multiple inheritance, what's the right way?
相关问题 更多 >
编程相关推荐