如何从子类调用基类的__ init__ 方法?

如果我有一个 python 类:

class BaseClass(object):
#code and the init function of the base class

然后我定义一个子类,比如:

class ChildClass(BaseClass):
#here I want to call the init function of the base class

如果基类的 init 函数接受一些参数,我将它们作为子类的 init 函数的参数,那么如何将这些参数传递给基类?

我写的代码是:

class Car(object):
condition = "new"


def __init__(self, model, color, mpg):
self.model = model
self.color = color
self.mpg   = mpg


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

我哪里做错了?

212452 次浏览

您可以像这样调用超类的构造函数

class A(object):
def __init__(self, number):
print "parent", number


class B(A):
def __init__(self):
super(B, self).__init__(5)


b = B()

注意:

这只有在父类继承 object时才有效

你可以用 super(ChildClass, self).__init__()

class BaseClass(object):
def __init__(self, *args, **kwargs):
pass


class ChildClass(BaseClass):
def __init__(self, *args, **kwargs):
super(ChildClass, self).__init__(*args, **kwargs)

你的缩进不正确,这是修改后的代码:

class Car(object):
condition = "new"


def __init__(self, model, color, mpg):
self.model = model
self.color = color
self.mpg   = mpg


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


car = ElectricCar('battery', 'ford', 'golden', 10)
print car.__dict__

输出如下:

{'color': 'golden', 'mpg': 10, 'model': 'ford', 'battery_type': 'battery'}

正如 Mingyu 指出的,在格式化方面存在一个问题。除此之外,我强烈建议在调用 super()时使用 不使用派生类的名称,因为它使代码不灵活(代码维护和继承问题)。在 Python3中,改用 super().__init__。以下是合并这些修改后的代码:

class Car(object):
condition = "new"


def __init__(self, model, color, mpg):
self.model = model
self.color = color
self.mpg   = mpg


class ElectricCar(Car):


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

感谢 Erwin Mayer 指出了在 super ()中使用 __class__的问题

如果您正在使用 Python 3,建议您直接调用 super ()而不使用任何参数:

class Car(object):
condition = "new"


def __init__(self, model, color, mpg):
self.model = model
self.color = color
self.mpg   = mpg


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


car = ElectricCar('battery', 'ford', 'golden', 10)
print car.__dict__

不要使用 同学们调用 super,因为它可能导致根据 这个答案产生无限递归异常。