继承object类的是新式类,不继承object类的是经典类
class A:
def foo(self):
print(‘called A.foo()’)
class B(A):
pass
class C(A):
def foo(self):
print(‘called C.foo()’)
class D(B, C):
pass
if name == ‘main’:
d = D()
d.foo()
B、C 是 A 的子类,D 多继承了 B、C 两个类,其中 C 重写了 A 中的 foo()方法。
如果 A 是经典类(如上代码),当调用 D 的实例的 foo() 方法时,
Python 会按照深度优先的方法去搜索 foo() ,路径是 B-A-C ,执行的是A中的 foo() ;
如果 A 是新式类,当调用 D 的实例的 foo() 方法时,
Python 会按照广度优先的方法去搜索 foo() ,路径是 B-C-A ,执行的是C中的 foo() 。
因为 D 是直接继承 C 的,从逻辑上说,执行C中的foo()更加合理,因此新式类对多继承的处理更为合乎逻辑。
本文探讨了Python中经典类与新式类在多继承场景下的不同行为。通过具体示例,展示了新式类如何采用更合理的广度优先搜索策略来解决方法解析顺序问题。
522

被折叠的 条评论
为什么被折叠?



