子类初始化参数

时间:2014-08-20 07:59:32

标签: python class inheritance

我想问一下,如果我们使用基类定义子类,为什么我们需要在__init__方法中初始化父类中的参数。我和JAVA OOP类似,我记得在Java中我们只是在子类中添加新参数。

如果我对Java也是错误的,有人可以解释一下这个原因吗?不应该通过编程让我们的生活更轻松。

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

    def display_car(self):
        print "This is a %s %s with %s MPG." % (self.color, self.model, self.mpg)

    def drive_car(self):
        self.condition = "used"

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



my_car = ElectricCar("Auris", "golden", 89, "molten salt")

我的意思是为什么在ElectricCar类中没有self.battery_type = battery_type足以进行这种继承?

2 个答案:

答案 0 :(得分:5)

您可以使用super() proxy object调用重写的__init__方法:

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

如果您使用的是Python 3,则可以省略类和自引用:

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

无论哪种方式,super()调用都会为您提供一个代理对象,您可以在其上查找整个父类链上的属性和方法;它会在链中找到下一个__init__方法,然后将其绑定,以便您可以将其称为常规方法。

答案 1 :(得分:3)

你可以写:

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