[解決済み] なぜ、スーパークラスの __init__ メソッドは自動的に呼び出されないのですか?
質問
Pythonの設計者はなぜ、サブクラスの
__init__()
メソッドを自動的に呼び出すことはありません。
__init__()
他の言語のように、そのスーパークラスのメソッドを使用するのですか?Pythonicで推奨されているイディオムは、本当に以下のようなものなのでしょうか?
class Superclass(object):
def __init__(self):
print 'Do something'
class Subclass(Superclass):
def __init__(self):
super(Subclass, self).__init__()
print 'Do something else'
解決方法は?
Pythonの肝心の
__init__
と他の言語
コンストラクタ
は、その
__init__
は
ではない
はコンストラクタです。
イニシャライザー
(実際の
コンストラクタ
(もしあればですが、後述;-)は
__new__
で、また全く違う動作をする)。 一方
を構築する
すべてのスーパークラス(そして、間違いなく、下に向かって構築を続ける前にそうすること)は、明らかに、あなたが
コンストラクション
の場合、サブクラスのインスタンスであることは明らかです。
初期化
というのも、スーパークラスの初期化をスキップしたり、変更したり、制御したりする必要がある多くのユースケースがあり、もし可能であれば、サブクラスの初期化の途中で行われたりするからです。
基本的に、Pythonではイニシャライザのスーパークラスへの委譲は自動的ではありません。
任意の
そして、それらの "他の言語" は、他のどのメソッドに対しても自動的なスーパークラス委譲を行わないということに注意してください...。
ちょうど
は、コンストラクタ(および該当する場合はデストラクタ)であり、これは、私が述べたように
ではなく
Pythonの
__init__
があります。 (動作の
__new__
もかなり特殊で、質問とは直接関係ないのですが、なぜなら
__new__
はこのように特殊なコンストラクタで、実際には必ずしも何かを構築する必要はありません -- 既存のインスタンスや、非インスタンスを返すことも十分に可能です。
ロット
あなたが考えているような他の言語よりも、力学的な制御が可能で、それは
また
での自動委譲がないことも含まれます。
__new__
そのものです!-)。
関連
-
pythonを使ったオフィス自動化コード例
-
Pythonによるjieba分割ライブラリ
-
[解決済み】Python regex AttributeError: 'NoneType' オブジェクトに 'group' 属性がない。
-
[解決済み] データ型が理解できない
-
[解決済み】OSError: [WinError 193] %1 は有効な Win32 アプリケーションではありません。
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】django インポートエラー - core.managementという名前のモジュールがない
-
[解決済み] Pythonで'super'は何をするのですか?- super().__init__() と明示的なスーパークラス __init__() の違い
-
[解決済み] なぜ __init__() は常に __new__() の後に呼び出されるのですか?
-
[解決済み] Javaでは静的メソッドは継承されるのですか?
最新
-
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 人工知能 人間学習 描画 機械学習モデル作成
-
Pythonによるjieba分割ライブラリ
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み] _tkinter.TclError: 表示名がなく、$DISPLAY環境変数もない。
-
[解決済み】numpyの配列連結。"ValueError:すべての入力配列は同じ次元数でなければならない"
-
[解決済み】socket.error: [Errno 48] アドレスはすでに使用中です。
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】「OverflowError: Python int too large to convert to C long" on windows but not mac
-
[解決済み] __init__() は親クラスの __init__() を呼び出すべきですか?