- 「このメソッドは必ず子クラスに実装させるぞ」という約束事を強制するための設計図だよ。そのクラス自身は直接使えないのがポイント。
- インターフェースの統一と共通処理の再利用を同時に実現できるから、大規模システムやフレームワーク設計で頻繁に登場する。
- チームで開発するとき「このメソッド、実装し忘れてた」というバグが実行前にコンパイルエラーで検出できるようになり、品質が上がる。
【深掘り】これだけ知ってればOK!
抽象クラスの本質は「設計上の契約」だ。具体的には、あるメソッドシグネチャが存在することをコンパイル時・インスタンス生成時に保証し、実装漏れを防ぐ仕組みを提供する。Java では abstract キーワードで宣言し、Python では abc.ABC を継承して @abstractmethod デコレーターを付与する。インターフェースとの違いは「共通の実装(具象メソッド)を持てること」にある。たとえば動物クラスで「鳴く」メソッドは各動物ごとに実装させつつ、「睡眠時間を記録する」メソッドは基底クラスで共通実装しておける。この使い分けが抽象クラスの最大の設計上の強みだ。
フレームワーク開発では抽象クラスがテンプレートメソッドパターンの基盤になることが多い。処理の大枠(骨格)を抽象クラスに定義し、個別の振る舞いだけをサブクラスに委ねる構造で、DjangoのViewクラスやJavaのHttpServletが代表例だ。django.views.generic.View では dispatch・get・post といったメソッドが設計上の拡張点として提供されており、開発者はこれらをオーバーライドするだけで共通処理(認証チェック・ロギング等)はフレームワーク側が担ってくれる。この「拡張点の明示」こそが抽象クラスを使う設計の醍醐味だ。
この見落としは特に既存コードを抽象クラスへリファクタリングする際に起きやすい。@abstractmethodを付加しただけで動作確認すると、抽象メソッドを未実装のサブクラスでもインスタンスが生成できてしまい、AttributeErrorが実行時に発生するまで気づかない。ABCMeta メタクラスの継承が抽象性の正体であることを押さえておくとよい。
よくある誤解
抽象クラスとインターフェースは同じものだという混同
インターフェースはメソッドのシグネチャのみを定義し実装を持たない(Javaの場合)のに対し、抽象クラスは具象メソッドとフィールドを持てる。Javaでは多重継承できないが、Pythonでは多重継承が可能なため両者の違いが異なる文脈を持つ点も注意が必要だ。
抽象クラスは大規模プロジェクト専用の設計パターンだと思っていないか?
たった3〜4クラスの小さなコードベースでも、抽象クラスを導入することでメソッドの実装漏れを静的に検出できる。規模より「チームの複数人開発か否か」や「将来の拡張が予見されるか」が導入判断の基準になる。
会話での使われ方

サブクラスを作ったのにメソッドが呼べなくてNoneが返ってくるんですが……
Python初学者がコードレビューでシニアエンジニアに相談している場面。@abstractmethodの使い方の誤りが原因。




このフレームワーク、抽象クラスを継承するだけで認証とロギングが全部入るんですよ。
バックエンドエンジニアが社内勉強会でDjangoのクラスベースビューを紹介している場面。




インターフェースで良かったんじゃないですか?なぜ抽象クラスにしたんですか?
設計レビュー会議でアーキテクトが新人開発者の設計案に対して理由を問いかけている場面。
【まとめ】3つのポイント
- 抽象クラスは「実装の強制」と「共通処理の再利用」を両立する:インターフェースと違い具象メソッドを持てるため、骨格実装を基底クラスに置きつつ可変部分だけをサブクラスに委ねられる。
- Pythonではabc.ABCの継承が必須:@abstractmethodだけでは抽象性が機能しないため、ABC継承とデコレーターの両方を正しく使うことがポイント。
- テンプレートメソッドパターンの基盤として活用する:処理の骨格を抽象クラスに定義し拡張点のみサブクラスへ委ねる設計は、フレームワーク開発でも日常的に使われる実践的パターンだ。
よくある質問
-
QPythonで抽象クラスを使うには何をインポートすればいいですか?
-
A
from abc import ABC, abstractmethod をインポートし、クラスをABCから継承した上で抽象化したいメソッドに@abstractmethodデコレーターを付けます。
-
Q抽象クラスを継承したサブクラスがインスタンス化できない場合の原因は?
-
A
抽象メソッドがすべて実装されていない場合にTypeErrorが発生します。@abstractmethodが付いたすべてのメソッドを明示的にオーバーライドしているか確認してください。
-
Q抽象クラスにコンストラクター(__init__)は書けますか?
-
A
書けます。抽象クラスのコンストラクターはsuper().__init__()でサブクラスから呼び出せるため、共通の初期化処理を親クラスに集約する際に便利です。
-
Q抽象クラスとインターフェースとの違いは何ですか?
-
A
抽象クラスは具象メソッドとフィールドを持てる一方でJavaでは単一継承しか許されず、インターフェースは純粋なメソッド契約のみを定義して多重実装が可能です。Pythonでは両概念が抽象クラスに統合されています。
【出典】参考URL
https://docs.python.org/ja/3/library/abc.html:Python公式ドキュメント — abc — 抽象基底クラス
https://refactoring.guru/design-patterns/template-method:Refactoring Guru — テンプレートメソッドパターン解説


コメント