Python抽象基底クラス(ABC)完全ガイド – 使い方とサンプルコード
目次
抽象基底クラス(ABC)とは?
Python の抽象基底クラス(Abstract Base Class、ABC)は、他のクラスの設計図となる特殊なクラスです。ABCを使うことで、子クラスが必ず実装すべきメソッドを定義でき、より堅牢なオブジェクト指向プログラムを作成できます。
ABCを使う理由とメリット
1. インターフェースの強制
ABCを継承したクラスは、抽象メソッドを必ず実装する必要があります。これにより、一貫したインターフェースを保証できます。
2. コードの可読性向上
どのメソッドが必須なのかが明確になり、チーム開発でのコミュニケーションが円滑になります。
3. バグの早期発見
抽象メソッドを実装し忘れた場合、インスタンス化時にエラーが発生するため、バグを早期に発見できます。
基本的な使い方
1. 基本的なABCの定義
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def make_sound(self):
pass
@abstractmethod
def move(self):
pass
class Dog(Animal):
def make_sound(self):
return "ワン!"
def move(self):
return "走る"
# 使用例
dog = Dog()
print(dog.make_sound()) # ワン!
print(dog.move()) # 走る
2. 抽象プロパティの使用
from abc import ABC, abstractmethod
class Shape(ABC):
@property
@abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
@property
def area(self):
return self.width * self.height
# 使用例
rect = Rectangle(5, 3)
print(rect.area) # 15
3. 具象メソッドとの組み合わせ
from abc import ABC, abstractmethod
class Vehicle(ABC):
def __init__(self, brand):
self.brand = brand
@abstractmethod
def start_engine(self):
pass
def get_info(self): # 具象メソッド
return f"ブランド: {self.brand}"
class Car(Vehicle):
def start_engine(self):
return "エンジン始動!"
# 使用例
car = Car("トヨタ")
print(car.get_info()) # ブランド: トヨタ
print(car.start_engine()) # エンジン始動!
実践的なサンプルコード
データベース操作の抽象化
from abc import ABC, abstractmethod
class DatabaseConnection(ABC):
@abstractmethod
def connect(self):
pass
@abstractmethod
def execute_query(self, query):
pass
@abstractmethod
def close(self):
pass
class MySQLConnection(DatabaseConnection):
def connect(self):
return "MySQL接続完了"
def execute_query(self, query):
return f"MySQL: {query} を実行"
def close(self):
return "MySQL接続終了"
class PostgreSQLConnection(DatabaseConnection):
def connect(self):
return "PostgreSQL接続完了"
def execute_query(self, query):
return f"PostgreSQL: {query} を実行"
def close(self):
return "PostgreSQL接続終了"
ファイル処理の抽象化
from abc import ABC, abstractmethod
class FileProcessor(ABC):
@abstractmethod
def read_file(self, filepath):
pass
@abstractmethod
def process_data(self, data):
pass
class CSVProcessor(FileProcessor):
def read_file(self, filepath):
return f"CSVファイル {filepath} を読み込み"
def process_data(self, data):
return "CSV形式でデータ処理"
class JSONProcessor(FileProcessor):
def read_file(self, filepath):
return f"JSONファイル {filepath} を読み込み"
def process_data(self, data):
return "JSON形式でデータ処理"
よくあるエラーと対処法
1. 抽象メソッドの実装忘れ
# エラーになる例
class Cat(Animal):
def make_sound(self):
return "ニャー"
# move()メソッドを実装していない
# cat = Cat() # TypeError が発生
2. ABCを継承せずに@abstractmethodを使用
# 間違った使い方
class BadExample:
@abstractmethod
def method(self):
pass
# 正しい使い方
class GoodExample(ABC):
@abstractmethod
def method(self):
pass
ABCの高度な使い方
1. 複数の抽象基底クラスの継承
from abc import ABC, abstractmethod
class Flyable(ABC):
@abstractmethod
def fly(self):
pass
class Swimmable(ABC):
@abstractmethod
def swim(self):
pass
class Duck(Animal, Flyable, Swimmable):
def make_sound(self):
return "クワッ"
def move(self):
return "歩く"
def fly(self):
return "飛ぶ"
def swim(self):
return "泳ぐ"
2. 抽象クラスメソッドの使用
from abc import ABC, abstractmethod
class MathOperation(ABC):
@classmethod
@abstractmethod
def calculate(cls, x, y):
pass
class Addition(MathOperation):
@classmethod
def calculate(cls, x, y):
return x + y
# 使用例
result = Addition.calculate(5, 3) # 8
まとめ
Python の抽象基底クラス(ABC)は、以下の場面で特に有効です:
- 大規模なプロジェクト: チーム開発でインターフェースを統一したい場合
- ライブラリ開発: ユーザーが実装すべきメソッドを明確にしたい場合
- 設計パターンの実装: Strategy パターンや Template Method パターンなど
ABCを適切に使用することで、保守性が高く、拡張しやすいPythonコードを書くことができます。まずは簡単な例から始めて、徐々に複雑なパターンに挑戦してみてください。
■らくらくPython塾 – 読むだけでマスター
■プロンプトだけでオリジナルアプリを開発・公開してみた!!
■AI時代の第一歩!「AI駆動開発コース」はじめました!
テックジム東京本校で先行開始。
■テックジム東京本校
「武田塾」のプログラミング版といえば「テックジム」。
講義動画なし、教科書なし。「進捗管理とコーチング」で効率学習。
より早く、より安く、しかも対面型のプログラミングスクールです。
<短期講習>5日で5万円の「Pythonミニキャンプ」開催中。
<月1開催>放送作家による映像ディレクター養成講座
<オンライン無料>ゼロから始めるPython爆速講座



