この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、クラスの機能の1つである継承について学びました。継承の機能をうまく使えば、作成したクラスを有効活用できますね。

今回も継承です。もう少し深堀してみましょう。
多重継承
前回ご紹介した継承の例は、1つの基底クラスを指定して派生クラスを作るものでした。2つ以上の基底クラスを指定して派生クラスを作る方法もあります。これを、多重継承と呼びます。 多重継承の派生クラスを作成するには、以下のように記述します。
class 派生クラス名(基底クラス名_1,基底クラス名_2 ・・・): # クラスの定義
それでは、実際の例を見ていきましょう。
class Class_A: def __init__(self): print("Class_Aの__init__が実行されました") def func_A(self): return "Class_Aのメソッドが実行されました" class Class_B: def __init__(self): print("Class_Bの__init__が実行されました") def func_B(self): return "Class_Bのメソッドが実行されました" class Class_C(Class_A , Class_B): pass a = Class_C() # Class_Aの__init__が実行されました print(a.func_A()) # Class_Aのメソッドが実行されました print(a.func_B()) # Class_Bのメソッドが実行されました
Class_Cは、Class_AとClass_Bを継承して作成されたクラスです。Class_A、Class_Bのメソッドが使えるようになっています。また、Class_A、Class_Bともにinitメソッドが設定されていますが、今回のケースではClass_Aのinitメソッドが実行されます。この様に名前が重複したメソッドがある場合、基底クラスの指定で左側にあるクラスのメソッドが実行されます。上の例からClass_Aのinitメソッドを削除すると、結果は以下のように変わります。
a = Class_C() # Class_Bの__init__が実行されました
super関数
super関数を使うと、派生クラスの元となる基底クラスのメソッドを直接実行できます。派生クラスでは、基底クラスのメソッドが使用できます。しかし、オーバーライドされると内容が変わってしまいます。この場合、一時的に基底クラスのメソッドを使う場合に使用します。以下の様に記述します。
super(クラス , インスタンス).メソッド
実際の例を見てみましょう。
class Class_C: def test(self): print("Class_Cのtest関数が実行されました。") class Class_D(Class_C): def test(self): print("Class_Dのtest関数が実行されました。") s1 = Class_D() s1.test() # Class_Dのtest関数が実行されました。 super(Class_D , s1).test() # Class_Cのtest関数が実行されました。
super関数を使うことで、基底クラスのメソッドを呼び出せています。super関数はクラス内でも使用可能です。上の例に続いて、以下を実行してみましょう。
class Class_E(Class_C): def test(self): super().test() print("Class_Eのtest関数が実行されました。") s2 = Class_E() s2.test() # Class_Cのtest関数が実行されました。 # Class_Eのtest関数が実行されました。
オーバーライドしたtest関数内で、基底クラスのtest関数が呼び出されています。この場合はsuper関数の引数は省略できます。
特殊メソッドでインスタンスを生成するためのコードとして、以下のコードをご紹介しました。
class ClassTest: def __new__(cls): print('__new__が実行されました') self = super().__new__(cls) # インスタンス生成 return self # 生成したインスタンスを返す
これは、基底クラスてあるobjectクラスのnewメソッドを呼び出しているんですね。
次回はライブラリ
いかがでしょうか。継承は奥が深いですね。しっかり理解したいところです。次回はモジュールです。Pythonプログラミングの可能性が拡がります。お楽しみに!!