組み込み型および他のクラスから派生する場合、組み込み型のコンストラクターがスーパークラス コンストラクターを呼び出していないようです。これにより、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__ が呼び出されます)。
継承順序へのこの非常に微妙な依存は、かなり非 Pythonic のように見えますが、このように意図されていますか? また、複雑なクラス階層の組み込み型から派生させてはならないということも意味します。なぜなら、他の誰かがクラスから派生したときに組み込み型が MRO のどこに行き着くのかを知ることができないからです (メンテナンスの恐怖)。何か不足していますか?
追加情報: Python バージョン 3.1