gpt4 book ai didi

python - Python如何传递多重继承的__init__参数

转载 作者:行者123 更新时间:2023-11-28 20:57:33 25 4
gpt4 key购买 nike

我有这段代码,显示了一个经典的菱形图案:

class A:
def __init__( self, x ):
print( "A:" + x )


class B( A ):
def __init__( self, x ):
print( "B:" + x )
super().__init__( "b" )


class C( A ):
def __init__( self, x ):
print( "C:" + x )
super().__init__( "c" )


class D( B, C ):
def __init__( self ):
super().__init__( "d" )


d = D()

输出是:

B:d
C:b
A:c
  • B:d 是有道理的,因为 D 派生自 B
  • 我几乎得到了 A:c,尽管我同样可以看到 A:b
  • 但是,C:b 位没有意义:C 不是从 B 派生的。

谁能解释一下?

this等问题不幸的是没有提到参数。

最佳答案

Python 使用 C3 linearization algorithm建立方法解析顺序,这与 super 委托(delegate)的顺序相同。

基本上,该算法为包含该类的每个类及其继承自的每个类,以及相关类继承自的所有类保留列表。然后,它通过一个接一个地获取未被任何未检查的类继承的类来构建类的排序,直到到达根 object。下面,为简洁起见,我使用 O 作为 object:

L(O) = [O]

L(A) = [A] + merge(L(O), [O]) = [A, O]

L(B) = [B] + merge(L(A), [A]) = [B] + merge([A, O], [A]) = [B, A] + merge([O])
= [B, A, O]

L(C) = [C] + merge(L(A), [A]) = [C] + merge([A, O], [A]) = [C, A] + merge([O])
= [C, A, O]

L(D) = [D] + merge(L(B), L(C), [B, C]) = [D] + merge([B, A, O], [C, A, O], [B, C])
= [D, B] + merge([A, O], [C, A, O], [C]) = [D, B, C] + merge([A, O], [A, O])
= [D, B, C, A, O]

关于python - Python如何传递多重继承的__init__参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52838240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com