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