我想问一下,如果我们使用基类定义子类,为什么我们需要在__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
足以进行这种继承?
答案 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