質問

組み込み型および他のクラスから派生する場合、組み込み型のコンストラクターはスーパークラスのコンストラクターを呼び出さないように見えます。その結果、MRO の組み込みの後にある型に対して __init__ メソッドが呼び出されなくなります。

例:

class A:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print("A().__init__()")

class B(list, A):
    def __init__(self, *args, **kwargs):
        print("B().__init__() start")
        super().__init__(*args, **kwargs)
        print("B().__init__() end")

if __name__ == '__main__':
    b = B()

このサンプルでは、​​A.__init__ は呼び出されません。B を次のように定義すると、 class B(A, list) 代わりに、継承順序を切り替えると、意図したとおりに動作します(つまり、A.__init__ が呼び出されます)。

この継承順序への非常に微妙な依存性は、Python らしくないように思えますが、これはこのように意図されているのでしょうか?これは、複雑なクラス階層では決して組み込み型から派生してはいけないことも意味します。なぜなら、他の誰かがクラスから派生したときに、組み込みが MRO のどこに行き着くのかがわからないからです (メンテナンスの恐怖)。何かが足りないのでしょうか?

追加情報:Python バージョン 3.1

正しい解決策はありません

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top