面试题答案
一键面试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
类继承A
和B
,如果A
和B
中有同名属性或方法,Python会优先使用A
中的,因为A
在继承列表中排在B
前面。
在C类中明确调用A或B的attr和method
- 调用属性:
- 可以使用
类名.属性名.__get__(实例对象)
的方式,如A.attr.__get__(self)
。
- 可以使用
- 调用方法:
- 直接使用
类名.方法名(实例对象)
,如A.method(self)
。 - 也可以在
C
类的方法中使用super()
来调用父类的方法,不过在多重继承且存在同名方法时,需要注意super()
遵循的MRO顺序。
- 直接使用