Python super()メソッドの原理の詳細な説明

Pythonクラスを学習すると、クラス内に__init __()のような関数が表示されます。これは、実際にはPythonの構築メソッドです。

構築メソッドは、新しく作成されたオブジェクトの状態を初期化するinit()のような初期化メソッドに似ています。これは、クラスのインスタンス化など、オブジェクトが作成された直後に呼び出されます。

f = FooBar()
f.init()#手動初期化

構築メソッドを使用すると、次の形式に簡略化できます。オブジェクトが作成された後、マジックメソッド__init __()が自動的に呼び出され、オブジェクトが初期化されます。

f = FooBar()

構築方法を理解した後、高度な質問、つまり、親クラスの構築メソッドの初期値を継承できないという問題に直面します。

classBird:
 def __init__(self):
  self.hungry = True
 def eat(self):if self.hungry:
  print 'Ahahahah'else:
  print 'No thanks!'classSongBird(Bird):
 def __init__(self):
  self.sound ='Squawk'
 def sing(self):
  print self.song()

sb =SongBird()
sb.sing()  #正常に出力できます
sb.eat()   #songgirdには空腹の機能がないため、エラーを報告してください

この問題を解決するには、次の2つの方法があります。

1、 バインドされていないスーパークラスコンストラクターを呼び出します(非推奨)

classSongBird(Bird):
 def __init__(self):
  Bird.__init__(self) #
  self.sound ='Squawk'
 def sing(self):
  print self.song()

原則:インスタンスのメソッドが呼び出されると、メソッドの自己パラメーターがインスタンスに自動的にバインドされます(バインディングメソッドと呼ばれます)。クラスのメソッド(Bird .__ init__など)が直接呼び出された場合、インスタンスは呼び出されません。バインドすると、必要な自己パラメーターを自由に指定できます(バインドされていないメソッド)。

2、 スーパー機能を使用する(推奨)

classSongBird(Bird):
 def __init__(self):super(SongBird,self).__init__()
  self.sound ='Squawk'
 def sing(self):
  print self.song()

原則:必要な特性が見つかるまで、すべてのスーパークラスとスーパークラスのスーパークラスを検索します。

super()関数は、親クラス(スーパークラス)を呼び出すために使用されるメソッドです。

superは、複数の継承の問題を解決するために使用されます。単一の継承を使用する場合は、クラス名を使用して親クラスのメソッドを直接呼び出すことは問題ありませんが、複数の継承を使用する場合は、検索順序(MRO)が必要になります。

(ダイヤモンドの継承)およびその他の問題を思い出してください。

MROは、クラスのメソッド解決シーケンステーブルであり、実際には、親クラスのメソッドを継承する場合のシーケンステーブルです。 (初心者ドキュメント)

以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。

Recommended Posts

Python super()メソッドの原理の詳細な説明
Python関数パラメータ分類の原理の詳細な説明
Pythonタイマースレッドプールの原理の詳細な説明
Pythondecimalモジュールの使用法の詳細な説明
Pythonインターフェース開発の実装手順の詳細な説明
Pythonオブジェクトの属性アクセスプロセスの詳細な説明
pythonに基づく残りの問題の詳細な説明(%)
pythonバックトラッキングテンプレートの詳細な説明
pythonシーケンスタイプの詳細な説明
pythonを実行するメソッドを終了します
PythonIOポート多重化の詳細な説明
pythonインスタンス化オブジェクトの特定のメソッド
pythonコマンドの-uパラメーターの詳細な説明
Python推測アルゴリズムの問題の詳細な説明
pythonインポートライブラリの特定の方法
Pythonでのpipの使用に関する詳細な説明|サードパーティライブラリのインストールの概要
python標準ライブラリOSモジュールの詳細な説明
pythonがコンカレントメソッドをサポートする方法の詳細な説明
Pythonに基づくデータタイプの詳細な説明
Ubuntuでの静的DNS構成方法の詳細な説明
Pythonプロセス制御の一般的なツールの詳細な説明
PythonWebページパーサーの使用例の詳細な説明
Pythonの基盤を統合する(4)
Python(7)の基盤を統合する
Python(6)の基盤を統合する
Python(5)の基盤を統合する
パラメータを渡すPythonメソッド
Pythonの基盤を統合する(3)
pythonでのwheelの使用法
Pythonの対数法の要約
Pythonプラグインメカニズムの詳細な実装
gpg2を使用したubuntuの詳細な説明
Pythonは中国語の4つの車輪を処理します
Pythonエラー処理は詳細な説明を主張します
地主取引のPythonシミュレーション
Pythonの用途は何ですか
Pythonでの辞書の詳細な使用法
Pythonは最も急な降下方法を実装します
Python文字列プーリングの前提
Python3.8の新機能の秘密
Pythonの父がMicrosoftに加わる
python accesshdfsの操作
pythonでのタプルの使用法
Ubuntu環境でのSSHのインストールと使用の詳細な説明
pythonでのrbの意味を理解する
Pythonはスタックの構造を実装できますか?
pythonインタラクティブモードの基本を学ぶ
pythonの必須パラメーターは何ですか
pythonの下部にあるロジスティック回帰
Python3クローラーでのAjaxの使用
PythonはTowerofHanoiゲームを解決します
pythonの複数のバージョンの競合を解決します
python変数の範囲は何ですか
Pythonは分数シーケンスの合計を実装します
Pythonガベージコレクションメカニズムの詳細な分析
Pythonの基礎を学ぶ2日間
pythonのid関数は何ですか
Pythonクラスの動的バインディングの実装原則
属性からプロパティまでのPython詳細な説明
python3のピップパスはどこにありますか
pythonにdjangoモジュールをインストールする方法