問題
私はこのコードに出くわしたオブジェクト指向プログラミングにより、ダスティ・フィリップス(簡潔にするために簡略化)と私は、この定義の特定の部分について不明な点。
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
質問
- メソッド解決順序があるので
(__main__.C, __main__.A, __main__.B, object)
、可能性がclass B
代わりに以下の方法で定義できますか?
class B:
def __init__(self, b):
self.b = b
- ではない
super().__init__(**kwargs)
にclass B
任意の余剰があるため、冗長kwargs
に渡さC
に渡されますobject
、調達?
例外TypeError:オブジェクト.__ initは__()、正確に一つの引数(初期化するインスタンス)を取り
- これは、ifのための安全策である
C
と定義したclass C(B, A)
代わりにclass C(A, B)
?
メソッド解決順序があるので
(__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)
。