Quantcast
Channel: HiroCom777の学習記録
Viewing all articles
Browse latest Browse all 90

継承_1(Python_30)

$
0
0

この連載では、Pythonについて色々な形で再学習に取り組んでいます。前回の記事はこちらになります。

hirocom777.hatenadiary.org

前回は、数値演算の特殊メソッドついて見ていきました。これまで色々な特殊メソッドを見てきました。種類によって挙動がすしずつ違うので注意が必要ですね。

今回はクラスの重要な機能の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で定義したメソッドを実行できています。もちろんオーバーライドも可能です。

次回も継承

いかがでしょうか。継承の機能をうまく使えば、作成したクラスを有効活用できますね。次回も継承です。もう少し深堀してみましょう。お楽しみに!!

Python再学習のまとめはこちら!!


Viewing all articles
Browse latest Browse all 90

Trending Articles