MST

星途 面试题库

面试题:Python子类中属性和方法的多重继承及冲突处理

考虑有三个类`A`、`B`、`C`,`C`类继承自`A`和`B`。`A`和`B`都有同名属性`attr`和同名方法`method`。请编写代码展示这种多重继承关系,并阐述Python是如何处理属性和方法冲突的,以及如何在`C`类中明确调用`A`或`B`的`attr`和`method`。
39.1万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
class A:
    def __init__(self):
        self.attr = 'A的attr'
    def method(self):
        return 'A的method'

class B:
    def __init__(self):
        self.attr = 'B的attr'
    def method(self):
        return 'B的method'

class C(A, B):
    def __init__(self):
        super().__init__()
        # 或者分别调用A和B的构造函数
        # A.__init__(self)
        # B.__init__(self)

    def call_A_attr(self):
        return A.attr.__get__(self)

    def call_A_method(self):
        return A.method(self)

    def call_B_attr(self):
        return B.attr.__get__(self)

    def call_B_method(self):
        return B.method(self)


c = C()
print(c.attr)  # 按照方法解析顺序MRO,会使用A类的attr,因为A在继承列表中排在前面
print(c.method())  # 同理,会使用A类的method

print(c.call_A_attr())
print(c.call_A_method())
print(c.call_B_attr())
print(c.call_B_method())

Python处理属性和方法冲突方式

Python使用**方法解析顺序(MRO)**来处理属性和方法冲突。MRO是一个线性列表,规定了在多重继承情况下,Python解释器查找属性和方法的顺序。当在类C中访问属性或方法时,Python会按照MRO从左到右依次在基类中查找。在上述代码中,C类继承AB,如果AB中有同名属性或方法,Python会优先使用A中的,因为A在继承列表中排在B前面。

在C类中明确调用A或B的attr和method

  1. 调用属性
    • 可以使用类名.属性名.__get__(实例对象)的方式,如A.attr.__get__(self)
  2. 调用方法
    • 直接使用类名.方法名(实例对象),如A.method(self)
    • 也可以在C类的方法中使用super()来调用父类的方法,不过在多重继承且存在同名方法时,需要注意super()遵循的MRO顺序。