Python3.8.5でのメソッドのオーバーライドと親クラスのメソッドの呼び出しについて。
#スーパークラス(親クラス)
class Ca(object):
def __init__(self, a=None): #親クラスのコンストラクター
self.a = a #self.aにaを代入
def fa(self):
print('あいうえお')
#サブクラス(子クラス)
class Ca_a(Ca): #引数に親クラスを指定することでクラスを継承
def fa(self): #オーバーライドで親のfaに上書きしてしまう
print('かきくけこ')
#サブクラス(孫クラス)
class Ca_b(Ca_a): #引数に子クラスを指定することで多重継承となる
def fa(self): #オーバーライドで親(子)のfaに上書きしてしまう
print('さしすせそ')
#サブクラス(孫クラスその②)
class Ca_c(Ca_a): #Ca_aクラスのサブクラス
def __init__(self, a='漢字', b=False): #孫クラスのコンストラクター
super().__init__(a) #親クラスのコンストラクターを呼び出して使用
self.b = b #bをself.bに代入
def fa(self): #オーバーライドで親(子)のfaに上書きしてしまう
print('たちつてと')
#実行
ca = Ca_a('ひらがな') #子のインスタンスから親のコンストラクターへアクセス
ca.fa() #かきくけこ ← オーバーライドで上書きされている
print(ca.a) #ひらがな
cb = Ca_b('平仮名') #孫のインスタンスから親のコンストラクターへアクセス
cb.fa() #さしすせそ ← オーバーライドで上書きされている
print(cb.a) #平仮名
cc = Ca_c() #孫その②のインスタンスの作成
print(cc.a) #漢字
class Ca(object):
def __init__(self, a=None): #親クラスのコンストラクター
self.a = a #self.aにaを代入
def fa(self):
print('あいうえお')
#サブクラス(子クラス)
class Ca_a(Ca): #引数に親クラスを指定することでクラスを継承
def fa(self): #オーバーライドで親のfaに上書きしてしまう
print('かきくけこ')
#サブクラス(孫クラス)
class Ca_b(Ca_a): #引数に子クラスを指定することで多重継承となる
def fa(self): #オーバーライドで親(子)のfaに上書きしてしまう
print('さしすせそ')
#サブクラス(孫クラスその②)
class Ca_c(Ca_a): #Ca_aクラスのサブクラス
def __init__(self, a='漢字', b=False): #孫クラスのコンストラクター
super().__init__(a) #親クラスのコンストラクターを呼び出して使用
self.b = b #bをself.bに代入
def fa(self): #オーバーライドで親(子)のfaに上書きしてしまう
print('たちつてと')
#実行
ca = Ca_a('ひらがな') #子のインスタンスから親のコンストラクターへアクセス
ca.fa() #かきくけこ ← オーバーライドで上書きされている
print(ca.a) #ひらがな
cb = Ca_b('平仮名') #孫のインスタンスから親のコンストラクターへアクセス
cb.fa() #さしすせそ ← オーバーライドで上書きされている
print(cb.a) #平仮名
cc = Ca_c() #孫その②のインスタンスの作成
print(cc.a) #漢字
メソッドのオーバーライドとは、親クラスと子クラスが共に持っている同名のメソッドの処理内容を子クラスのもので上書きして呼び出す機能のことです。
上記のスクリプトでは、親クラスも子クラスも孫クラスも、みんなfaメソッドをもっています。
このfaメソッドをサブクラスのインスタンスから呼び出すと、親クラスのfaメソッドではなくその子クラスにあるfaメソッドが呼び出されます。
この現象(機能?)のことをメソッドのオーバーライドと呼びます。
super()を使った親クラスのメソッドの呼び出し方は、上記スクリプトのとおりです。
super().__init__() と記述すると、親クラスのコンストラクターを呼び出して使うことができます。
以上です。