在python多继承中,是否有可能让一位家长访问另一位家长而不知道该家长是什么?

问题描述:

在我的代码,我有继承关系B -> C -> D,且有特定功能的兴趣在这里在python多继承中,是否有可能让一位家长访问另一位家长而不知道该家长是什么?

class C(B): 
    def f(self): 
     if <some condition>: 
      B.f(self) 
     else: 
      <do other stuff> 

f而问题是,有很多现实B多种可能性,但C的逻辑一样。然后直接使用线性遗传多次,即,

B1 -> C1 -> D1 
B2 -> C2 -> D2 
B3 -> C3 -> D3 

然而,这是浪费。于是我想到用多重继承的

D1(C, B1) 
D2(C, B2) 
D3(C, B3) 

那么问题是如何做C.f()访问B1.f()(同为B2B3),因为它只会通过D1B1存在?

在这种情况下使用多重继承是一个坏主意吗?或者有没有比直接的多线程继承与多重继承(如果有效)更好的方法?

这是一个关于多重继承的经典问题,最终导致一些语言退出多重继承。

然而,Python只是通过巧妙制作一个巧妙制作的“方法分辨率命令”(mro)算法,以及随后的内置调用super的出现而逃脱。该算法及其历史记录详述于https://www.python.org/download/releases/2.3/mro/

但是,历史悠久,它只是按预期“按心”运作。例如,通过在交互式解释粘贴代码:

class A: pass 
class B(A): 
    def f(self): raise NotImplementedError 
class C(B): 
    def f(self): 
     super().f() 
     print("C") 
class B1(B): f = lambda s: print("B1") 
class B2(B): f = lambda s: print("B2") 
class D(C, B1): pass 
class D1(C, B2): pass 

一起摆弄时,我们得到以下结果:

In [25]: D().f() 
B1 
C 

In [26]: D1().f() 
B2 
C 

In [27]: D.__mro__ 
Out[27]: (__main__.D, __main__.C, __main__.B1, __main__.B, __main__.A, object)