pythonサブクラス呼び出し親メソッドのプロファイリング

1557 ワード

super()多重継承は「自動重量除去」
上のコードサブクラスでは、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回だけ呼び出すようにします.