python笔记 多继承上

64 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

0 环境

  • 编辑器:pycharm或者vscode
  • 系统版本:windows10
  • python版本:3.9.6

1 多继承的意义

比如现在有个动物A,它是哺乳动物,并且它会奔跑,这个动物A继承(哺乳动物),这里的跑的能力,我把它加到哺乳动物里不就行拉,这样是不是就ok了呢,我继承了它,拥有这个能力没问题,但假如又来了个动物B,它是哺乳动物,但是它会飞,是不是要在哺乳动物里加上个飞的能力,动物B继承了哺乳动物,然后它会飞会跑,显然是有问题,现在出现了多重继承,哺乳动物一个类,跑是一个类,飞也是一个类,对于动物A来说就是,class 动物A(哺乳动物, 跑),动物B来说就是,class 动物B(哺乳动物, 飞),这样一来,一个子类可以同时获得n多个父类的所有功能。

2 正文

正常我写一个class类,默认继承object,填不填效果是一样的,是可以忽略的。如下代码:

class A:
    pass

# 这种方式等同于下面那个方式
class B(A):
    pass

class B1(A, object):
    pass

这么一说,大部分的类是多继承(在继承列表中存在多个类的时候就称它多继承)。但多继承也会也很多的疑问,比如C(A, B),假如A和B都有相同的方法名,该调用谁呢?

看下图的结果:是不是谁在继承列表靠前,就打印谁。

class A:
    def run(self):
        print("A")

class B:
    def run(self):
        print("B")

class C(A, B):
    pass

class C1(B, A):
    pass

print("-- C --")
C().run()
print("-- C1 --")
C1().run()

image.png

假如我现在在定义一个类E,它的父类有B,然后我在定义一个类F,它的父类有B,E。相当于E(B),F(B, E)或F(E, B),会遇到MRO的报错,在换个顺序又好了,这个MRO顺序的问题下篇再说。

3 总结

多继承呢,平时再用,只是没在意而已,并且子类完美继承所有父类的功能,比如现在继承列表中,多个父类方法名相同,我该拿谁的呢,谁靠前拿谁,换个记忆方式,就近原则(近水楼台先得月),这n个父类,谁离类名近,就用谁的方法。