[解決済み】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" に適合しています。
関連
-
PythonはWordの読み書きの変更操作を実装している
-
Pythonショートビデオクローラーチュートリアル
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] C#でベースコンストラクタを呼び出す
-
[解決済み] Pythonのクラスはなぜオブジェクトを継承するのですか?
-
[解決済み】Pythonに三項条件演算子はありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python call matlab メソッドの詳細
-
Python百行で韓服サークルの画像クロールを実現する
-
PyQt5はユーザーログインGUIインターフェースとログイン後のジャンプを実装しています。
-
Pythonの画像ファイル処理用ライブラリ「Pillow」(グラフィックの詳細)
-
PythonでECDSAを実装する方法 知っていますか?
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】ValueError: pickleプロトコルがサポートされていません。3、python2 pickleはpython3 pickleでダンプしたファイルを読み込むことができない?
-
[解決済み】cアンダースコア式`c_`は、具体的に何をするのですか?
-
[解決済み] Pythonでスーパーコンストラクタを呼び出すには?