Last Updated on 2025年7月28日
概要
Pythonで開発をしていると、NotImplementedError: Subclasses should implement this! というエラーに遭遇することがあります。このエラーは、オブジェクト指向プログラミングの基本である「継承」に関わるもので、基底クラスのメソッドをサブクラスで適切にオーバーライドしていない場合に発生します。
この記事では、このエラーの意味、発生する原因、解決方法、そして補足情報をわかりやすく解説します。
目次
エラー内容
このエラーは以下のようなメッセージで表示されます:
|
1 |
NotImplementedError: Subclasses should implement this! |
主に、基底クラス(親クラス)で定義されたメソッドにNotImplementedErrorが書かれているのに、子クラス(サブクラス)でそのメソッドを実装していない場合に発生します。これは、開発者に対して「このメソッドは必ずサブクラスで実装してください」という意図を伝える仕組みです。
原因
このエラーの原因は、次のようなコード構造にあります。
|
1 2 3 4 5 6 7 8 9 |
class Base: def process(self): raise NotImplementedError("Subclasses should implement this!") class Derived(Base): pass obj = Derived() obj.process() # ここでエラー発生 |
このように、基底クラスBaseでprocess()メソッドにNotImplementedErrorを仕込んでおり、派生クラスDerivedでそれをオーバーライドせずに使用しようとすると、エラーになります。
背景にある意図
PythonにはJavaやC#のような抽象クラスやインターフェースの明確な構文がありません。その代替として、NotImplementedErrorを使って「このメソッドはオーバーライド必須ですよ」と強制するテクニックが使われます。
対処法
エラーを解消するには、サブクラスで該当メソッドを必ずオーバーライドする必要があります。
|
1 2 3 4 5 6 7 8 9 10 |
class Base: def process(self): raise NotImplementedError("Subclasses should implement this!") class Derived(Base): def process(self): print("実際の処理を実装しました") obj = Derived() obj.process() # 正常に動作します |
推奨:abcモジュールを使った抽象クラスの定義
Pythonのabcモジュールを使うと、より明示的に抽象クラスを定義できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
from abc import ABC, abstractmethod class Base(ABC): @abstractmethod def process(self): pass class Derived(Base): def process(self): print("抽象メソッドを実装済み") obj = Derived() obj.process() |
@abstractmethodデコレーターを使うと、実装していない場合にインスタンス化そのものが禁止されるため、より安全に設計できます。
注意点:間違った実装の例
以下のようにメソッドを呼び出さない場合にはエラーになりませんが、これは問題を先送りにしているだけです。
|
1 2 3 4 5 |
class Derived(Base): pass # メソッドを呼び出していないためエラーにはならない obj = Derived() |
将来的に呼び出されたときにエラーが発生するため、必ず実装するようにしましょう。
補足
NotImplementedErrorとNotImplementedの違い
- NotImplementedError はエラー(例外)であり、実装されていないことを明示するために raise されます。
- NotImplemented は値(オブジェクト)であり、演算子オーバーロードの際に使用されます(例:
__eq__や__lt__など)。
|
1 2 3 4 |
def __eq__(self, other): if isinstance(other, MyClass): return self.id == other.id return NotImplemented |
自作ライブラリ開発時の使い所
NotImplementedErrorは、自作のライブラリやフレームワークを開発する際に「設計の意図」を明示するのに非常に有効です。将来の保守性・可読性を考慮して積極的に活用するのが良い設計となります。
まとめ
NotImplementedErrorは、サブクラスで必須のメソッドが未実装である場合に発生します。- このエラーは、継承ベースの設計において「オーバーライドを強制する」ために使われます。
- サブクラス側で該当メソッドをきちんと実装することで回避可能です。
- より安全な設計のために、
abcモジュールを使うことを推奨します。 NotImplementedErrorとNotImplementedは別物であることに注意しましょう。
Pythonでの設計ミスや不具合を防ぐためにも、このエラーの意味をしっかりと理解しておくことが重要です。


