Pythonにおける抽象クラス

Pythonにおける抽象クラス

この記事ではPythonにおける抽象クラスについて説明します。

abcモジュールを利用した抽象クラスの基本的な仕組みや実用的な例を示し、コードとともに解説します。

YouTube Video

Pythonにおける抽象クラス

Pythonのabcモジュール(Abstract Base Classes: 抽象基底クラス)は、抽象クラスを定義するための標準ライブラリの一部であり、クラスが提供するべきメソッドのテンプレートを作るのに使われます。このモジュールを活用することで、クラス設計における柔軟性と堅牢性を高めることができます。

抽象クラスとは?

抽象クラスは、具象クラス(インスタンス化可能なクラス)の共通のインターフェースを定義するために使用されるクラスです。抽象クラス自体はインスタンス化できず、必ず派生クラス(サブクラス)で具象的な実装を行う必要があります。

abcモジュールを利用することで、抽象メソッドやプロパティを定義し、それを継承するクラスに対して、必要なメソッドの実装を強制できます。抽象メソッドが1つでも未実装である場合、そのクラスもインスタンス化できません。

abcモジュールの使い方

abcモジュールを使って抽象クラスを作成するには、まずABCクラスを継承し、@abstractmethodデコレーターを使って抽象メソッドを定義します。

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"

ここでは、Animalクラスが抽象クラスとして定義されており、soundという抽象メソッドを持っています。このメソッドは、サブクラスで具象的に実装される必要があります。DogCatは、Animalを継承し、それぞれsoundメソッドを実装しています。

抽象クラスのインスタンス化

抽象クラスは直接インスタンス化できません。例えば、Animalクラス自体をインスタンス化しようとすると、エラーが発生します。

1animal = Animal()  # TypeError: Can't instantiate abstract class Animal with abstract methods sound
  • 抽象クラスをインスタンス化しようとすると、Pythonは「未実装の抽象メソッドがある」と判断し、TypeErrorを発生させます。サブクラスで必要なすべての抽象メソッドが実装されていれば、インスタンス化可能です。

複数の抽象メソッド

1つのクラスに複数の抽象メソッドを持たせることも可能です。全ての抽象メソッドをサブクラスで実装しなければ、そのクラスは抽象クラスのままです。

 1from abc import ABC, abstractmethod
 2
 3class Vehicle(ABC):
 4
 5    @abstractmethod
 6    def start_engine(self):
 7        pass
 8
 9    @abstractmethod
10    def stop_engine(self):
11        pass
12
13class Car(Vehicle):
14    def start_engine(self):
15        return "Car engine started"
16
17    def stop_engine(self):
18        return "Car engine stopped"

この例では、Vehicleクラスが2つの抽象メソッドを持っており、Carクラスは両方のメソッドを実装することで、初めてインスタンス化が可能になります。

抽象プロパティの定義

abcモジュールは、抽象メソッドだけでなく、抽象プロパティもサポートしています。これにより、派生クラスでプロパティを実装することを強制できます。

 1from abc import ABC, abstractmethod
 2
 3class Shape(ABC):
 4
 5    @property
 6    @abstractmethod
 7    def area(self):
 8        pass
 9
10class Circle(Shape):
11    def __init__(self, radius):
12        self.radius = radius
13
14    @property
15    def area(self):
16        return 3.14159 * (self.radius ** 2)
  • この例では、Shapeクラスに抽象プロパティareaが定義されており、サブクラスCircleはそのプロパティを具象化しています。このように、抽象クラスを使ってプロパティの実装も強制できるため、コードの一貫性が保たれます。

isinstance()issubclass()の利用

抽象クラスを使うと、isinstance()issubclass()でクラスの継承関係を確認でき、コードの安全性や柔軟性が向上します。

 1from abc import ABC, abstractmethod
 2
 3# Definition of the abstract base class
 4class Animal(ABC):
 5
 6    @abstractmethod
 7    def sound(self):
 8        pass
 9
10# Concrete implementation in the subclass
11class Dog(Animal):
12    def sound(self):
13        return "Woof!"
14
15class Cat(Animal):
16    def sound(self):
17        return "Meow!"
18
19class Vehicle(ABC):
20
21    @abstractmethod
22    def start_engine(self):
23        pass
24
25    @abstractmethod
26    def stop_engine(self):
27        pass
28
29class Car(Vehicle):
30    def start_engine(self):
31        return "Car engine started"
32
33    def stop_engine(self):
34        return "Car engine stopped"
35
36print("Dog() is an Animal? -> ", isinstance(Dog(), Animal))   # True
37print("Dog is subclass of Animal? -> ", issubclass(Dog, Animal))  # True
38print("Cat() is a Vehicle? -> ", isinstance(Cat(), Vehicle))  # False

isinstance()はオブジェクトが指定されたクラスのインスタンスかどうかを、issubclass()はクラスが指定されたクラスを継承しているかどうかを確認するために使います。

まとめ

abcモジュールを利用して抽象クラスを設計することで、クラス間のインターフェースを明確にし、必要なメソッドやプロパティの実装を強制することができます。これにより、コードの一貫性を保ち、ミスを減らすことができるため、特に大規模なプロジェクトでは非常に有用です。

抽象クラスはPythonの柔軟なオブジェクト指向プログラミングをサポートし、クラスの再利用性やメンテナンス性を向上させる重要なツールです。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video