MST

星途 面试题库

面试题:Python类方法调用中的继承与覆盖

假设有一个父类A和一个子类B,B继承自A。A类中有一个实例方法`func`,在子类B中重写了`func`方法。请阐述当通过子类B的实例调用`func`方法时,Python的方法调用机制是如何工作的,包括查找顺序等细节。如果在子类B的`func`方法中想要调用父类A的`func`方法,有哪些方式,每种方式的原理是什么?
30.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

Python的方法调用机制

  1. 查找顺序:当通过子类B的实例调用func方法时,Python会按照**方法解析顺序(MRO)**来查找该方法。MRO采用C3线性化算法,先在子类B自身的命名空间中查找func方法。如果找到,就直接调用该方法;如果没找到,就按照继承关系链向上查找,在父类A的命名空间中查找func方法。由于子类B重写了func方法,所以在子类B的命名空间中就会找到该方法并调用,不会再去父类A中查找。

在子类B的func方法中调用父类A的func方法的方式及原理

  1. 使用super()
    • 方式:在Python 3中,可以使用super().func() 。在Python 2中,如果子类B是新式类(继承自object),也可以使用super(B, self).func()
    • 原理super() 返回一个特殊的对象,该对象会按照MRO顺序查找下一个类。当调用super().func() 时,它会在MRO中查找在子类B之后的下一个类(即父类A),并调用父类A中的func方法。这样做的好处是,当继承结构发生变化时(比如增加或删除中间层的类),代码无需修改。
  2. 直接通过类名调用
    • 方式:在子类B的func方法中,可以使用A.func(self)
    • 原理:这种方式直接指定调用父类A的func方法,并将子类B的实例self作为参数传递进去。它不依赖于MRO,而是明确地调用父类A中定义的func方法。但这种方式在继承结构发生变化时,需要手动修改类名,不够灵活。