问题
子类如果重写了父类的方法,就会把父类的方法覆盖。那么,在这种情况下如何才能调用被覆盖的父类方法呢?
解决方案
此时若想调用父类中的方法,有两种方案可以达成。
1.调用未绑定的父类方法
2.使用super函数,也就是我们今天要讲的重点
实例说明
举个例子,首先来看一下代码
class Fish:
def _init_(self):
#坐标取0到10之间的随机数
self.x = r.randint(0,10)
self.y = r.randint(0,10)
def move(self):
self.x -= 1
print("我的位置是:",self.x,self.y)
#Shark类继承自Fish类
class Shark(Fish):
def _init_(self):
self.hungry = True
def eat(self):
if self.hungry:
print("吃货的梦想就是天天有的吃^_^"")
self.hungry = False
else:
print("太撑了,吃不下了")
可以看到此时代码中子类Shark重写了父类Fish中的初始化方法,那么move方法就应该可以正常继承过来,但是当运行shark.move()时也会报错(这里shark是Shark类的实例)。这是为什么呢?
其实是因为move方法中包含x变量,由于覆盖了父类中的初始化方法,Shark类初始化时没有x变量而导致的。
好了,下面就是解决方案的实例了
- 调用未绑定的父类方法
在Shark类的初始化方法中多加一行Fish._init_(self)
即可。如下所示。
def _init_(self)
Fish._init_(self)
self.hungry = True
Fish._init_(self)
括号中的self为子类Shark的实例对象,并没有绑定父类,所以叫它是未绑定的父类方法。
- 使用super函数
在Shark类的初始化方法中多加一行super()._init_()
即可,连self参数都可以不用传入。如下所示。
def _init_(self)
super()._init_()
self.hungry = True
总结
这两种方法中,相较之下,super函数更好用。
super函数可以自动帮我们找到基类的方法,并且会为我们传入self参数。
super函数超级之处,就是在于不用给定任何基类的名字,在多重继承时,可以自动帮你一层层找出所有基类里面对应的方法。
由于不用给定任何基类的名字,所以在需要改变类的继承关系时,只需要修改括号里父类的名字就可以了。
补充一句:多重继承(一个类同时继承多个类)容易导致代码混乱,当不确定必须要使用多重继承的语法时,请尽量避免使用它。