class X:
def __init__(self):
self.a = 10
def method():
return 1
class Y(X):
def __init__(self):
self.b = 20
print(vars(Y()))
# {'b': 20}
print(Y().method())
# 1
それだけだと親クラスの初期化処理が行われなくて vars の結果に a が存在しない
初期化されてないだけで継承されてるので method メソッドは使える
他言語で言う super の実行が必要
なくてもエラーはないけど初期化されない
super() は親コンストラクタを表してるわけじゃないので super() で取得できるインスタンスの __init__ メソッド呼び出しが必要
class X:
def __init__(self):
self.a = 10
class Y(X):
def __init__(self):
super().__init__()
self.b = 20
print(vars(Y()))
# {'a': 10, 'b': 20}
子クラスの方で __init__ を書かなければ自動で親クラスが実行される
子クラスで __init__ を定義して初期化するなら 必要あるときだけ親クラスの初期化メソッドを実行できる
実行したくないならしないことができる
class X:
def __init__(self):
self.a = 10
class Y(X):
pass
print(vars(Y()))
# {'a': 10}
実行タイミングも自由に指定できる
self を使う前とか最初じゃなくていい
class X:
def __init__(self):
self.a = 10
class Y(X):
def __init__(self):
self.a = 100
super().__init__()
print(self.a)
Y()
# 10