继承和重写

知识点

单继承定义

1
2
3
# 子类继承父类、父类的祖先类所有的方法和属性
class 类名(父类名称):
类体

多继承定义

1
2
3
4
# 多继承的子类继承了所有父类的方法和属性
# 继承的父类之间尽量不要有相同名称的方法和属性
class 类名(父类1, 父类2, 父类3, ... ):
类体
1
# 若继承的父类中有相同名称的方法和属性,在未调整顺序之前,优先调用先继承的父类中指定的方法

方法搜索顺序:__mro__

1
2
3
# (知道)__mro__:是python的内置属性,用于在多继承时判断方法、属性的调用路径
print(类名.__mro__)
# __mro__按照打印内容从左到右顺序查找,先在当前类中查找,然后再按顺序依次到下一个类中查找,找到即执行,不再找下去,如果找完所有的类都没有寻找到方法就报错

方法的重写(多态)

备注:当父类的方法无法满足子类的需求时,并且两者实现的方式完全不同,则需要在子类中重写父类的方法

1
# 定义方式:定义一个与父类中被重写的方法同名的方法即可

方法的拓展

备注:当父类的方法无法满足子类的需求时,父类封装的方法是子类方法的一部分,此时需要用拓展实现

1
2
3
# 1. 在子类中重写父类的方法
# 2. 在需要的位置使用"super().父类方法"来调用父类方法的执行
# 3. 代码其它位置针对子类的需求,编写子类特有的代码实现

super类:super是一个特殊的类,super()就是使用super类创建出来的对象,最常使用的场景是在重写父类方法时,调用在父类中封装的方法实现

1
2
3
4
5
6
7
8
9
10
class Dog:

def bark(self):
print("叫")

class fire(Dog):

def bark(self):
print("这个是新增的内容")
super().bark() # 此处就调用了父类的bark方法,(不推荐)相当于"类名.方法名(self)"

作业

  1. (问答)如何定义一个继承类(分单继承、多继承)
  2. (问答)当父类的方法无法满足子类的需求时,并且两者实现的方式完全不同,此时如何在子类中实现自己的方法
  3. (问答)当父类的方法无法满足子类的需求时,父类封装的方法是子类方法的一部分,此时如何在子类中实现自己的方法
  4. (问答)在多继承中,若有多个父类含有相同名称的方法,则此时子类对象调用这些方法,会得出什么结果