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
という抽象メソッドを持っています。このメソッドは、サブクラスで具象的に実装される必要があります。Dog
やCat
は、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チャンネルもご覧ください。