持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
1. 父类的私有属性和私有方法
- 子类对象不能在自己的方法内部,直接访问父亲的私有属性或私有方法
- 子类对象可以通过父类的公有方法间接访问到私有属性或私有方法
- 私有属性、方法是对象的隐私,不对外公开,外界以及子类都不能直接访问
- 私有属性、方法通常用于做一些内部的事情
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的特点,这时候我们就可以使用多继承,是子类对象具有多个父类的属性和方法,从而降低代码的重复率。
3. 多继承的注意事项
如果不同父类中存在同名的方法,子类对象在调用方法时,会调用哪一个父类中的方法呢?
温馨提示:在开发时,应该尽量避免这种容易产生混淆的情况,如果父类之间存在同名的属性或者方法,应该尽量避免使用多继承。
4. Python的方法搜索顺序(MRO)
- Python中针对类提供了一个内置属性(两个下划线开头,两个下划线结尾)
__mro__可以查看方法搜索顺序 - MRO是method resolution order,主要用于在多继承时判断方法、属性的调用路径
- 在搜索方法时,是按照__mro__的输出结果从左至右的顺序查找的
- 如果在当前类中找到方法,就直接执行,不再搜索
- 如果没有找到,就查找下一个类中是否有对应的方法,如果找到,就直接执行,不再搜索
- 如果找到最后一个类,还没有找到方法,程序报错 例如,在上一个案例末尾继续添加如下代码,查看C类的MRO顺序
# 确定C类对象调用方法的顺序
print(C.__mro__)
程序运行结果如下图所示:通过此图就知道C类对象调用方法的顺序,顺序为:先是C类本身,然后是A类,然后是B类。