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爆速講座