Python-面向对象编程-多继承

107 阅读2分钟

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

1. 父类的私有属性和私有方法

  1. 子类对象不能在自己的方法内部,直接访问父亲的私有属性或私有方法
  2. 子类对象可以通过父类的公有方法间接访问到私有属性或私有方法
  • 私有属性、方法是对象的隐私,不对外公开,外界以及子类都不能直接访问
  • 私有属性、方法通常用于做一些内部的事情

2. 多继承

多继承的概念:

  • 子类可以拥有多个父类,并且具有所有父类的属性方法
  • 例如:孩子会继承自己父亲和母亲的特性
  • 语法:class 子类名(父类名1, 父类名2...): 代码示例如下所示:创建A,B,C三个类,希望用C类创建对象,使其继承A类和B类中的方法。
class A:
    def test(self):
        print("test方法")


class B:
    def demo(self):
        print("demo方法")


class C(A, B):
    pass


# 创建子类对象
c = C()
c.test()
c.demo()

程序运行结果如下图所示:在开发中,已经有两个类封装完成,我们希望一个新的类既具有A的特点,又具有B的特点,这时候我们就可以使用多继承,是子类对象具有多个父类的属性和方法,从而降低代码的重复率。

image.png

3. 多继承的注意事项

如果不同父类中存在同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?

温馨提示:在开发时,应该尽量避免这种容易产生混淆的情况,如果父类之间存在同名的属性或者方法,应该尽量避免使用多继承。

4. Python的方法搜索顺序(MRO)

  • Python中针对类提供了一个内置属性(两个下划线开头,两个下划线结尾)__mro__可以查看方法搜索顺序
  • MRO是method resolution order,主要用于在多继承时判断方法、属性的调用路径
  • 在搜索方法时,是按照__mro__的输出结果从左至右的顺序查找的
  • 如果在当前类中找到方法,就直接执行,不再搜索
  • 如果没有找到,就查找下一个类中是否有对应的方法,如果找到,就直接执行,不再搜索
  • 如果找到最后一个类,还没有找到方法,程序报错 例如,在上一个案例末尾继续添加如下代码,查看C类的MRO顺序
# 确定C类对象调用方法的顺序
print(C.__mro__)

程序运行结果如下图所示:通过此图就知道C类对象调用方法的顺序,顺序为:先是C类本身,然后是A类,然后是B类。

image.png