1. ホーム
  2. パイソン

[解決済み】pythonで親のイニシャライザーを連鎖的に呼び出す【重複あり

2022-03-31 19:56:27

質問

ベースクラスA、Aを継承するクラスB、Bを継承するクラスCを考えてみましょう。イニシャライザで親クラスのイニシャライザを呼び出す一般的な方法は何でしょうか?もし、これでもまだ漠然としすぎていると思われるなら、ここにいくつかのコードがあります。

class A(object):
    def __init__(self):
        print "Initialiser A was called"

class B(A):
    def __init__(self):
        super(B,self).__init__()
        print "Initialiser B was called"

class C(B):
    def __init__(self):
        super(C,self).__init__()
        print "Initialiser C was called"

c = C()

今はこうしています。しかし、まだ少し非ジェネリックすぎるようです。正しい型を手で渡さなければなりません。

さて、次に試したのは self.__class__ を super() の第一引数にすると、明らかにうまくいきません。C のイニシャライザーにすると、公平に B のイニシャライザーが呼び出されます。Bで同じことをすると、"self" はまだCのインスタンスを指しているので、結局Bのイニシャライザーをもう一度呼び出すことになります(これは無限再帰に終わります)。

今はダイヤモンド継承について考える必要はなく、この特定の問題を解決することに興味があるだけです。

どのように解決するのか?

あなたがやっている方法は、確かに推奨されている方法です(Python 2.xの場合)。

に明示的にクラスを渡すかどうかが問題です。 super は、機能性よりもスタイルの問題です。クラスを super は、Pythonの哲学である "explicit is better than implicit" に適合しています。