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

継承_2(Python_31)

$
0
0

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

hirocom777.hatenadiary.org

前回は、クラスの機能の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プログラミングの可能性が拡がります。お楽しみに!!

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


Viewing all articles
Browse latest Browse all 90

Trending Articles