pythonサブクラス呼び出し親メソッドのプロファイリング
1557 ワード
super()多重継承は「自動重量除去」
上のコードサブクラスでは、class son(Father)Fatherは明らかに親を指していますが、親メソッドを呼び出すときに、直接Father('tom')Father('tom')を使ってもいいですか?ほとんどの場合問題ありません.しかし、多重継承にかかわると、面倒になります.
出力が見える
Personクラスは2回初期化され、呼び出し親のコードをsuper()呼び出しに変更すると、各_init__()メソッドは1回のみ呼び出されます.pythonは自動的に重くなるようです.
pythonはどのように継承を実現しますか
定義されたクラスごとに、Pythonは線形メソッドの解析順序(MRO)のリストを計算します.クラスの_を印刷できます.mro__プロパティはMROの継承順シーケンス(python 3ベース):
pythonはMROリストから左から右に順に検索し、検索対象のプロパティが見つかるまで、メソッドごとに1回だけ呼び出すようにします.
上のコードサブクラスでは、class son(Father)Fatherは明らかに親を指していますが、親メソッドを呼び出すときに、直接Father('tom')Father('tom')を使ってもいいですか?ほとんどの場合問題ありません.しかし、多重継承にかかわると、面倒になります.
class Person():
def __init__(self):
print('person init')
class Father(Person):
def __init__(self, name):
Person.__init__(self)
print('father name is ' + name)
self.name = name
def run(self):
print(self.name + ' is run')
class Mother(Person):
def __init__(self, name):
Person.__init__(self)
print('mother name is ' + name)
self.name = name
def run(self):
print(self.name + ' is walk')
class Son(Father, Mother):
def __init__(self, name):
Father.__init__(self, 'tom')
Mother.__init__(self, 'Merry')
self.name = name
s = son('kk')
出力が見える
person init
father name is tom
person init
mother name is Merry
Personクラスは2回初期化され、呼び出し親のコードをsuper()呼び出しに変更すると、各_init__()メソッドは1回のみ呼び出されます.pythonは自動的に重くなるようです.
pythonはどのように継承を実現しますか
定義されたクラスごとに、Pythonは線形メソッドの解析順序(MRO)のリストを計算します.クラスの_を印刷できます.mro__プロパティはMROの継承順シーケンス(python 3ベース):
print(Son.__mro__)
(, , , , )
pythonはMROリストから左から右に順に検索し、検索対象のプロパティが見つかるまで、メソッドごとに1回だけ呼び出すようにします.