8.3.3 super关键字

8.3.3 super关键字

子类可以父类的所有公有方法进行重写,但是在进行构造方法重写时,一定要先调用父类的构造方法。

在子类中定义构造函数时,由于父类的构造函数不会被自动调用,所以在子类的构造函数中要先调用父类的构造函数,并传以必要的参数,用于初始化父类的属性,然后再通过赋值语句初始化子类中新增加的属性成员。如果不显式调用父类构造函数,父类构造函数就不会被执行,导致子类实例访问父类初始化方法中初始的变量就会出现问题。例如:

由于父类Plant的构造函数中有参数water,而子类Fruit中并未显式调用父类,创建对象时也未传递参数,故运行会有如下错误:

还有一种情况,如果在子类中定义了构造方法,就不会再自动调用父类的构造方法。而当在子类的其他方法中调用父类的属性时,由于子类定义__init__()方法就相当于重写了父类的__init__()方法,所以如果在子类中未对这些父类的属性进行初始化,使用时就会出错。例如:

则会有如下报错:

为避免这些错误,如果父类、子类都定义了构造方法,经常在定义子类的构造方法时,先调用父类的构造方法,格式如下:

对父类构造函数的调用,其实也是对父类构造函数的重写。对父类构造函数的调用代码如下:

运行结果如下:

除了使用父类名.__init__()的方式调用父类外,Python还提供了super()关键字。super()关键字常用于子类的__init__()方法中,用来调用父类的某个方法,调用格式有两种写法,格式一如下:

格式二如下:

利用super()调用父类方法,代码如下:

super()主要是用于解决多重继承问题,避免多重继承带来的一些问题。