オブジェクト指向プログラミング(OOP)における抽象クラスは、具体的な実装を持たないクラスであり、他のクラスが継承して具体的な動作を実装するためのテンプレートとして機能します。抽象クラスを使用することで、共通のインターフェースを強制し、一貫性のある設計を実現することができます。このセクションでは、Pythonを用いて抽象クラスの基本概念と実装方法を初心者にもわかりやすく解説します。
抽象クラスは、以下の特徴を持つクラスです:
抽象クラスは、abc
(Abstract Base Classes)モジュールを使用して定義します。
Pythonでは、abc
モジュールを利用して抽象クラスを定義します。以下に、抽象クラスを定義する基本的な方法を示します。
from abc import ABC, abstractmethod
class 抽象クラス名(ABC):
@abstractmethod
def 抽象メソッド名(self, 引数):
pass
以下に、動物を表す抽象クラス Animal
を定義し、具体的な動物クラス Dog
と Cat
がそれを継承して具体的な動作を実装する例を示します。
from abc import ABC, abstractmethod
class Animal(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def speak(self):
pass # 具体的な実装はサブクラスに任せる
def move(self):
print(f"{self.name} は移動しています。")
class Dog(Animal):
def speak(self):
return f"{self.name} はワンワンと鳴きます。"
class Cat(Animal):
def speak(self):
return f"{self.name} はニャーニャーと鳴きます。"
Animal
:ABC
(Abstract Base Class)を継承して抽象クラスとして定義します。speak
メソッドを抽象メソッドとして定義し、具体的な実装はサブクラスに任せます。move
メソッドは具体的な実装を持ち、全ての動物が移動する動作を提供します。
サブクラス Dog
と Cat
:
Animal
クラスを継承し、speak
メソッドを具体的に実装します。抽象クラスを使用すると、共通のインターフェースを持ちながら、具体的な動作をサブクラスで実装することができます。
# 抽象クラスとサブクラスの定義(上記参照)
# サブクラスのインスタンスを生成
dog = Dog("Buddy")
cat = Cat("Lucy")
# メソッドの呼び出し
print(dog.speak()) # 出力: Buddy はワンワンと鳴きます。
print(cat.speak()) # 出力: Lucy はニャーニャーと鳴きます。
# 共通メソッドの使用
dog.move() # 出力: Buddy は移動しています。
cat.move() # 出力: Lucy は移動しています。
抽象クラス Animal
は直接インスタンス化できませんが、サブクラス Dog
と Cat
は具体的な実装を持つため、インスタンス化が可能です。
メソッドの呼び出し:
speak
メソッドはサブクラスで具体的に実装されているため、適切な動作が出力されます。move
メソッドは抽象クラスで具体的に定義されているため、全てのサブクラスで共通の動作が実行されます。ここでは、図形を表す抽象クラス Shape
を定義し、具体的な図形クラス Circle
と Rectangle
がそれを継承して面積を計算する方法を示します。
from abc import ABC, abstractmethod
import math
class Shape(ABC):
@abstractmethod
def area(self):
pass # 面積の計算はサブクラスに任せる
def describe(self):
print(f"これは {self.__class__.__name__} です。")
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return math.pi * (self.radius ** 2)
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
# サブクラスのインスタンスを生成
circle = Circle(5)
rectangle = Rectangle(4, 6)
# メソッドの呼び出し
circle.describe() # 出力: これは Circle です。
print(f"円の面積: {circle.area()}") # 出力: 円の面積: 78.53981633974483
rectangle.describe() # 出力: これは Rectangle です。
print(f"四角形の面積: {rectangle.area()}") # 出力: 四角形の面積: 24
Shape
:area
を定義し、具体的な面積の計算はサブクラスに任せます。describe
メソッドは具体的な図形の説明を提供します。
サブクラス Circle
と Rectangle
:
area
メソッドを具体的に実装し、それぞれ円と四角形の面積を計算します。TypeError
が発生します。python
animal = Animal("Generic Animal") # TypeError: Can't instantiate abstract class Animal with abstract methods speak
abc
モジュールを使用して抽象クラスを定義し、@abstractmethod
デコレーターを用いて抽象メソッドを宣言します。