Python 抽象プロパティ

Ammar Ali 2023年6月21日
Python 抽象プロパティ

このチュートリアルでは、abc または抽象基本クラス モジュールを使用して、Python で抽象プロパティを持つクラスを作成する方法について説明します。

Python 抽象プロパティ

オブジェクト指向プログラミングの抽象化は、不要な情報をユーザーから隠すために使用されます。 関数の内部動作はユーザーから隠されますが、ユーザーは関数を使用してタスクを実行できます。

たとえば、コンピューター ソフトウェアを使用してさまざまなタスクを実行しますが、ソフトウェアがそのタスクをどのように実行するかはわかりません。 ソフトウェアに入力を与え、ソフトウェアから出力を得るだけです。

Python では抽象化を使用して、無関係な情報を隠すことでプログラムの複雑さを軽減できます。

1つ以上の抽象メソッドが含まれている場合、クラスは抽象になります。 抽象メソッドはサブクラスで定義され、抽象クラスは他のクラスの設計図であるため、抽象クラスはサブクラスから継承されます。

Python では、abc モジュールまたは抽象基本クラス モジュールを使用して、抽象クラスを実装できます。 抽象基本クラスは、サブクラスのインターフェイスを提供します。これは、コードが大きく、すべてのクラスを覚えておくのが難しい場合に役立ちます。

abc モジュールを基本クラスにインポートし、それを使用して基本クラスのメソッドを抽象として装飾する必要があります。 抽象メソッドを定義するには、基本クラスでメソッドを定義する前に @abstractmethod デコレーターを使用できます。また、@property デコレーターを使用して、メソッドを抽象プロパティにすることができます。

たとえば、abc モジュールをインポートして、ABC クラスから継承される Bike クラスを作成してみましょう。 Bike クラス内で、抽象メソッド mileage() を作成します。

基本クラスを継承して、抽象メソッドを持つさまざまなサブクラスを実装できるようになりました。 以下のコードを参照してください。

# Class Code
from abc import ABC, abstractmethod


class Bike(ABC):
    @property
    @abstractmethod
    def mileage(self):
        pass


class Honda(Bike):
    def mileage(self):
        print("The mileage is 20kmph")


class CD70(Bike):
    def mileage(self):
        print("The mileage is 15kmph ")


class CD150(Bike):
    def mileage(self):
        print("The mileage is 34kmph ")


# Main Code

h = Honda()
h.mileage()

r = CD70()
r.mileage()

s = CD150()
s.mileage()

出力:

The mileage is 20kmph
The mileage is 15kmph
The mileage is 34kmph

上記のコードでは、サブクラスのオブジェクトを作成し、バイクの走行距離を表示するメソッド mileage() を呼び出しました。 Bike クラスにも mileage() メソッドがありますが、メソッドが抽象的であるため呼び出すことができません。

たとえば、上記の例を繰り返して、Bike クラスの mileage メソッドを呼び出してみましょう。 以下のコードを参照してください。

# Class Code
from abc import ABC, abstractmethod


class Bike(ABC):
    @property
    @abstractmethod
    def mileage(self):
        pass


class Honda(Bike):
    def mileage(self):
        print("The mileage is 20kmph")


class CD70(Bike):
    def mileage(self):
        print("The mileage is 15kmph ")


class CD150(Bike):
    def mileage(self):
        print("The mileage is 34kmph ")


# Main Code
b = Bike()
b.mileage()

出力:

TypeError: Can't instantiate abstract class Bike with abstract methods mileage

上記のコードは、抽象クラス Bike に抽象メソッドがあることを明確に示しています。これが、そのオブジェクトを作成できず、そのメソッドを呼び出すことができない理由です。

最初のメソッドの定義の前に @abstractmethod デコレーターを使用して、他のクラスのメソッドを抽象メソッドとして作成することもできます。 メソッドにアクセスするためにそのクラスのオブジェクトを作成しようとすると、Python はエラーを出します。

たとえば、サブクラスのメソッドを抽象化してみましょう。 以下のコードを参照してください。

# Class Code
from abc import ABC, abstractmethod


class Bike(ABC):
    @property
    @abstractmethod
    def mileage(self):
        pass


class Honda(Bike):
    @abstractmethod
    def mileage(self):
        print("The mileage is 20kmph")

    def mileage2(self):
        print("The mileage is 200 kmph")


# Main Code
b = Honda()
b.mileage2()

出力:

TypeError: Can't instantiate abstract class Honda with abstract methods mileage

Honda クラスに 2つのメソッドを定義しましたが、クラスが抽象的であるため、いずれにもアクセスできません。 抽象基本クラスの詳細については、この リンク を確認してください。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Python Class