Python类继承没有做我认为应该做的事情

时间:2016-02-23 17:02:53

标签: python python-2.7

我认为我理解python中的类继承,基本上你可以在子类上继承父类的属性以便重用,并且还可以“添加”它以使更复杂的类。

以下是我的问题:我有一个Car类,其中(model, color, mpg)作为参数,之后我创建了一个名为ElectricCar的新子类,它继承自父Car }} class ...现在,当我使用“ElectricCar”调用(battery_type, model, color, mpg)时,我收到以下错误:

  

TypeError:init()只需要2个参数(给定5个)

我知道要解决它。我需要将self.modelself.colorself.mpg添加到ElectricCar类。但为什么我必须这样做?如果我需要在子类上重新定义,这似乎会破坏继承的目的。

class Car(object):
    condition = "new"
    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

my_car = Car("DeLorean", "silver", 88)

class ElectricCar(Car):
    def __init__(self,battery_type):
        self.battery_type = battery_type

my_car = ElectricCar("molten salt", "Honda","black", "33")

3 个答案:

答案 0 :(得分:5)

  

我需要将self.modelself.colorself.mpg添加到ElectricCar课程。

你不是。 Python允许您调用已替换的父类的方法。您只需要显式调用父类的构造函数。

ElectricCar.__init__的第一个参数是电池类型。将其余的位置参数存储在列表(args)中并将它们解压缩到父构造函数:

class ElectricCar(Car):
    def __init__(self, battery_type, *args):
        super(ElectricCar, self).__init__(*args) # super().__init__(*args) in Py3k+
        self.battery_type = battery_type

答案 1 :(得分:2)

定义__init__方法时,将覆盖父类的__init__方法。这样的重写是创建super()函数的原因。

答案 2 :(得分:0)

您需要在ElectricCar类中传递model,color,mpg。然后你可以调用super来初始化基类。

class Car(object):
    condition = "new"
    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg
        print model
        print color
        print  mpg

my_car = Car("DeLorean", "silver", 88)
print

class ElectricCar(Car):
    def __init__(self,battery_type, model, color, mpg):
        self.battery_type = battery_type
        print battery_type
        super(ElectricCar,self).__init__( model, color, mpg)

my_car = ElectricCar("molten salt", "Honda","black", "33")