kwargsからと多重継承

Josmoor98:

問題

私はこのコードに出くわしたオブジェクト指向プログラミングにより、ダスティ・フィリップス(簡潔にするために簡略化)と私は、この定義の特定の部分について不明な点。

class A:
    def __init__(self, a, **kwargs):
        super().__init__(**kwargs)
        self.a = a

class B:
    def __init__(self, b, **kwargs):
        super().__init__(**kwargs)
        self.b = b

class C(A, B):
    def __init__(self, c, **kwargs):
        super().__init__(**kwargs)
        self.c = c

質問

  1. メソッド解決順序があるので(__main__.C, __main__.A, __main__.B, object)、可能性がclass B代わりに以下の方法で定義できますか?
class B:
    def __init__(self, b):
        self.b = b
  1. ではないsuper().__init__(**kwargs)class B任意の余剰があるため、冗長kwargsに渡さCに渡されますobject、調達?

例外TypeError:オブジェクト.__ initは__()、正確に一つの引数(初期化するインスタンス)を取り

  1. これは、ifのための安全策であるCと定義したclass C(B, A)代わりにclass C(A, B)
kaya3:

メソッド解決順序があるので(__main__.C, __main__.A, __main__.B, object)、可能性がclass B代わりに以下の方法で定義できますか?

いいえ、なぜならこれは失敗します。

class D:
    def __init__(self, d, **kwargs):
        self.d = d
        super().__init__(**kwargs)

class E(C, D):
    def __init__(self, e, **kwargs):
        self.e = e
        super().__init__(**kwargs)

MROはEある(E, C, A, B, D, object)ので、B呼び出す必要がありsuper().__init__そうD.__init__呼ばれることはありません。

ではないsuper().__init__(**kwargs)class B任意の余剰があるため、冗長kwargsに渡さCに渡されますobject、調達?

いいえ、余剰があるためkwargsに行くだろうD.__init__、上記の例では。しかし、たとえそれなしで、あなたがあまりにも多くの引数を持つコンストラクタを呼び出したときにエラーが発生する冗長ではありません。検出されないためにではなく間違いのためよりも、あなたの不正なコードについてあなたを通知するエラーメッセージを有することが望ましいです。

これは、ifのための安全策であるCと定義したclass C(B, A)代わりにclass C(A, B)

ある意味では、確か。しかし、本当にそれはのためのセーフガードだBで発生するあらゆる階層内の他のクラスが呼び出したのと同じルールに従う限り、クラス階層super().__init__(**kwargs)

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=21408&siteId=1