python 多继承 同名方法或属性
当一个类继承多个父类,并且这些父类中有同名的方法或属性时,Python会按照一定的顺序进行方法解析顺序(Method Resolution Order,MRO)。
MRO的顺序是通过C3线性化算法计算得出的。在Python中,可以通过class.__mro__属性来查看类的方法解析顺序。
当调用一个同名方法时,Python会按照MRO的顺序从左到右查找,直到找到第一个匹配的方法为止。如果找不到匹配的方法,就会抛出一个AttributeError异常。
对于同名属性,Python会按照MRO的顺序从左到右查找,返回第一个找到的属性的值。
下面是一个示例代码,演示了多继承中的同名方法和属性的调用顺序:
class A:
def foo(self):
print('A foo')
class B:
def foo(self):
print('B foo')
class C(A, B):
pass
c = C()
c.foo() # 输出:A foo
print(c.__class__.__mro__) # 输出:(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
class D(A, B):
def foo(self):
super().foo()
print('D foo')
d = D()
d.foo() # 输出:A foo D foo
print(d.__class__.__mro__) # 输出:(<class '__main__.D'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)
class E(B, A):
def foo(self):
super().foo()
print('E foo')
e = E()
e.foo() # 输出:B foo A foo E foo
print(e.__class__.__mro__) # 输出:(<class '__main__.E'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>)
在上面的代码中,类C继承了类A和类B,调用c.foo()时,由于MRO的顺序是C、A、B,所以调用的是类A中的foo方法。
类D和类E是对多继承中同名方法的调用进行了扩展。类D通过super().foo()调用了父类A中的foo方法,并在此基础上添加了自己的处理逻辑。类E同样调用了父类A中的foo方法,并在此基础上添加了自己的处理逻辑。注意,super()函数会根据MRO的顺序来确定调用的下一个父类。
在实际开发中,多继承中的同名方法和属性可能会导致代码的可读性和维护性变差。因此,在使用多继承时,应尽量避免同名方法和属性的存在,或者通过合理的设计和使用super()函数来解决冲突
原文地址: https://www.cveoy.top/t/topic/iwS0 著作权归作者所有。请勿转载和采集!