在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()
(同为B2
,B3
),因为它只会通过D1
的B1
存在?
在这种情况下使用多重继承是一个坏主意吗?或者有没有比直接的多线程继承与多重继承(如果有效)更好的方法?
答
这是一个关于多重继承的经典问题,最终导致一些语言退出多重继承。
然而,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)