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