面试题答案
一键面试Python的方法调用机制
- 查找顺序:当通过子类B的实例调用
func
方法时,Python会按照**方法解析顺序(MRO)**来查找该方法。MRO采用C3线性化算法,先在子类B自身的命名空间中查找func
方法。如果找到,就直接调用该方法;如果没找到,就按照继承关系链向上查找,在父类A的命名空间中查找func
方法。由于子类B重写了func
方法,所以在子类B的命名空间中就会找到该方法并调用,不会再去父类A中查找。
在子类B的func
方法中调用父类A的func
方法的方式及原理
- 使用
super()
:- 方式:在Python 3中,可以使用
super().func()
。在Python 2中,如果子类B是新式类(继承自object
),也可以使用super(B, self).func()
。 - 原理:
super()
返回一个特殊的对象,该对象会按照MRO顺序查找下一个类。当调用super().func()
时,它会在MRO中查找在子类B之后的下一个类(即父类A),并调用父类A中的func
方法。这样做的好处是,当继承结构发生变化时(比如增加或删除中间层的类),代码无需修改。
- 方式:在Python 3中,可以使用
- 直接通过类名调用:
- 方式:在子类B的
func
方法中,可以使用A.func(self)
。 - 原理:这种方式直接指定调用父类A的
func
方法,并将子类B的实例self
作为参数传递进去。它不依赖于MRO,而是明确地调用父类A中定义的func
方法。但这种方式在继承结构发生变化时,需要手动修改类名,不够灵活。
- 方式:在子类B的