satopoooonのブログ

自分向けの備忘録

pythonサブクラスのコンストラクタ定義時の注意点(親クラスのコンストラクタが上書きしないように)

  • サブクラスのコンストラクタ定義時の注意点 サブクラスでコンストラクタを定義する際、
    親クラスのコンストラクタをオーバーライドしないように注意しましょう。
class B:
    """
    親クラス
    """
    def __init__(self) -> None:
        self.x = 10

class D(B):
    """
    サブクラス2

    自分の __init__ を定義しているが
    super().__init__() を呼んでいないバージョン
    """

    # noinspection PyMissingConstructor
    def __init__(self):
        self.y = 20

これで、コンストラを呼び出してみます。

obj2 = D()
print(obj2.x)
print(obj2.y)

出力は

AttributeError("'D' object has no attribute 'x'",)

となります。 →親クラスのコンストラクタがオーバーライドされてしまったせいです。
これを防ぐためには、サブクラス定義時に、

class E(B):
    """
    サブクラス3

    自分の __init__ を定義していて
    super().__init__() も呼んでいるバージョン
    """

    def __init__(self):
        super().__init__()
        self.y = 20

とする必要があります。
以下参考

Pythonメモ-57 (サブクラスで __init__ を定義する場合の注意点) (class, super, __init__, Never code a method that just delegates to the superclass) - いろいろ備忘録日記