抽象クラスを作成しサブクラスで具体的なメソッドを定義し実装する

スポンサーリンク

抽象クラスを作成しサブクラスで具体的なメソッドを定義し実装してみます。

■今回の環境(Python)

今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)

■抽象クラスを作成しサブクラスで具体的なメソッドの定義

では、早速抽象クラスを作成しサブクラスで具体的なメソッドを定義し実装するために、コードを書いていきます。

■コード

class Vehicle:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color
    
    def drive(self):
        raise NotImplementedError("Subclasses must implement the drive method.")


class Car(Vehicle):
    def drive(self):
        return "Driving the car"


class Motorcycle(Vehicle):
    def drive(self):
        return "Riding the motorcycle"

今回はVehicleというオブジェクトを作成するためのテンプレート(設計図)であるクラス(親クラス )を定義します。このクラスは、定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとしてbrandを設定し、第3の引数,パラメータとしてcolorを設定します。なお、最初の「self(自己)」という引数,パラメータを介して「brand」、「color」というクラスのインスタンス変数が初期化されます。この時にself(自己)に対してドット演算子( . )を用いて「brand」、「color」を指定します。

次にdef文を用いてdriveというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、「raise NotImplementedError」というPythonの組み込み関数を用いて、指定した例外を発生させる処理となります。

次にCarというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてVehicleを渡します。これでVehicleが継承されます。クラスを定義後、クラス内にdef文を用いてdriveというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、returnとして英語の文字列を返すという処理になります。

次にMotorcycleというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。括弧内には引数,パラメータとしてVehicleを渡します。これでVehicleが継承されます。クラスを定義後、クラス内にdef文を用いてdriveというメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。このメソッドが呼び出された時の処理として、returnとしてCarというクラス内のメソッドを定義する際に記述した英語の文字列とは別の文字列を返すという処理になります。

■実行・検証

このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。

# Vehicleクラスのインスタンスを作成し、driveメソッドを呼び出す
vehicle = Vehicle("Unknown", "Black")
vehicle.drive()

まずはVehicleクラスのインスタンスを作成し、作成されたオブジェクトを介してdriveメソッドを呼び出してみます。

---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
 in ()
     20 # Vehicleクラスのインスタンスを作成し、driveメソッドを呼び出す
     21 vehicle = Vehicle("Unknown", "Black")
---> 22 vehicle.drive()

 in drive(self)
      5 
      6     def drive(self):
----> 7         raise NotImplementedError("Subclasses must implement the drive method.")
      8 
      9 

NotImplementedError: Subclasses must implement the drive method.

実行してみると「NotImplementedError」というエラーが発生しました。このエラーはCarクラスや Motorcycleクラスのような具体的な乗り物のクラスでdrive メソッドをオーバーライドして実装する必要がありますが、今回オーバーライドしなかったため、このようなエラーが発生しました。

# Carクラスのインスタンスを作成し、driveメソッドを呼び出す
car = Car("Toyota", "Red")
car.drive()

では、次にCarクラスのインスタンスを作成し、driveメソッドを呼び出してみます。

呼び出してみると、Carクラスは、具体的な乗り物のクラスであるため、drive メソッドをオーバーライドでき、Carクラス内のdriveメソッド内の処理が実行され、結果が出力されました。

# Motorcycleクラスのインスタンスを作成し、driveメソッドを呼び出す
motorcycle = Motorcycle("Honda", "Blue")
motorcycle.drive()

では、次にMotorcycleクラスのインスタンスを作成し、driveメソッドを呼び出してみます。

呼び出してみると、こちらもCarクラスと同じく、Motorcycleクラスは、具体的な乗り物のクラスであるため、drive メソッドをオーバーライドでき、Carクラス内のdriveメソッド内の処理が実行され、結果が出力されました。

コメント

タイトルとURLをコピーしました