この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。
前回は、数値演算の特殊メソッドついて見ていきました。これまで色々な特殊メソッドを見てきました。種類によって挙動がすしずつ違うので注意が必要ですね。

今回はクラスの重要な機能の1つ、継承について学んでいきたいと思います。
継承とは何か
継承とはクラスの機能です。何かの目的でクラスを作成したとします。その後、このクラスはそままで機能を修正、拡張したクラスが欲しい場合があります。そんな場合に使用する機能が継承です。この時、元になるクラスを、基底クラス、親クラス、スーパークラスなどと呼びます。これに対して、基底クラスをもとに作成されたクラスのことを、派生クラス、子クラス、サブクラスなどと呼びます。
派生クラスを作成するには、以下のように記述します。
class 派生クラス名(基底クラス名): # クラスの定義
最初にクラスについて学んだ際に、クラスの定義方法は記述を省略している部分があって、正しくは以下のように書く、と紹介しました。
class クラス名(object): # クラスの定義
つまりPythonで作成されるクラスは、すべてobjectクラスを基底クラスとして作成された(基底クラスを継承した)派生クラスなのです。
継承の例
それでは実際の例を見ていきましょう。以下のスクリプトを実行してみましょう。
class Class_A: def __init__(self , data): print(f"Class_Aの__init__が実行されました。入力値は{data}です。") class Class_B(Class_A): pass a = Class_A(1) # Class_Aの__init__が実行されました。入力値は1です。 b = Class_B(2) # Class_Aの__init__が実行されました。入力値は2です。
Class_Bは、Class_Aを継承したクラスで、その他の内容はありません。しかしながらオブジェクトを作成すると、Class_Aのinitメソッドが実行されます。引数で設定された値は、それぞれの値が渡されています。
オーバーライド
それでは上の例で、Class_Bにもinitメソッドを実装すると、どうなるのでしょうか。以下のスクリプトを実行してみましょう。
class Class_A: def __init__(self , data): print(f"Class_Aの__init__が実行されました。入力値は{data}です。") class Class_B(Class_A): def __init__(self , data): print(f"Class_Bの__init__が実行されました。入力値は{data}です。") a = Class_A(1) # Class_Aの__init__が実行されました。入力値は1です。 b = Class_B(2) # Class_Bの__init__が実行されました。入力値は2です。
今度はそれぞれのinitメソッドが実行されました。この様に基底クラスを継承した派生クラスでも、同名のメソッドを内部に記述すると、派生クラスのメソッドが実行されます。この様に基底クラスのメソッドを上書きする行為を「オーバーライド」と言います。そもそもClass_Aに記述されているinitメソッド自体も、objectクラスのinitメソッドをオーバーライドしたものです。
また、オブジェクトの値比較の特殊メソッドを取り扱った際に、eqメソッドなどを定義する例をご紹介しましたが、これもobjectクラスのメソッドをオーバーライドしたものです。
一般のメソッドのオーバーライド
上の例は特殊メソッドのオーバーライドでしたが、一般のメソッドでもオーバーライド可能です。
class Class_C: def test(self): return "Class_Cのtest関数が実行されました。" class Class_D(Class_C): pass c = Class_C() d = Class_D() print(c.test()) # Class_Cのtest関数が実行されました。 print(d.test()) # Class_Cのtest関数が実行されました。
Class_DからもClass_Cで定義したメソッドを実行できています。もちろんオーバーライドも可能です。
次回も継承
いかがでしょうか。継承の機能をうまく使えば、作成したクラスを有効活用できますね。次回も継承です。もう少し深堀してみましょう。お楽しみに!!