NotImplementedError是Python内置的“占位信号”异常,用于提示子类必须实现父类中定义的抽象方法,常见于抽象基类(ABC)和模板模式中。

为什么Python会抛出 NotImplementedError
NotImplementedError 是 Python 的内置异常,它本身不表示错误,而是一种“占位信号”:开发者明确告诉别人“这个方法必须由子类实现,当前只是个壳”。它常出现在抽象基类(ABC)或模板模式中,比如你继承了某个类、重写了 __init__,但忘了实现关键的 process() 方法,运行时一调用就炸。
如何定位哪个方法没实现
报错信息里通常只显示 NotImplementedError,不带方法名。这时候别急着翻文档,先看 traceback 最上面几行——重点找最后一行调用的函数名,再顺着往上找,大概率是某个父类方法内部调用了 self.do_something(),而你的子类没定义它。
- 检查 traceback 中倒数第二行的调用点,比如
result = self.transform(data) - 确认该方法是否在父类里写的是
raise NotImplementedError - 搜索你的子类里有没有同名方法(注意拼写、大小写、参数数量)
- 如果用了
@abstractmethod,确保子类确实继承自ABC且未被__subclasshook__绕过
实现时要注意的三个细节
光补上一个空函数还不够,容易埋下逻辑漏洞或类型错误。
- 签名必须严格一致:参数名、默认值、
*args/**kwargs都要和父类声明对齐,否则可能触发TypeError - 返回值类型需匹配预期:比如父类文档说返回
list,你就不能返回None或str,否则下游代码会崩得更晚、更难查 - 避免“假实现”:写个
pass或return None应付编译器,结果运行时报AttributeError或TypeError—— 这比原异常更难调试
示例:父类有 def serialize(self, obj: dict) -> str:,你的实现就得接收 dict、返回 str,哪怕先用 json.dumps(obj) 快速兜底。
立即学习“Python免费学习笔记(深入)”;
用 abc.ABC 和 @abstractmethod 提前暴露问题
靠运行时报 NotImplementedError 太被动。更稳妥的方式是在定义父类时就用抽象机制强制约束:
from abc import ABC, abstractmethod
class DataProcessor(ABC):
@abstractmethod
def load(self, path: str) -> dict:
...
@abstractmethod
def validate(self, data: dict) -> bool:
...
这样只要有人写 class MyProc(DataProcessor): pass,连实例化都会失败,提示 “Can't instantiate abstract class”,比等到调用时才报错早得多。
真正复杂的地方往往不是“怎么写实现”,而是“怎么判断这个方法到底该干啥”——父类没文档、示例缺失、测试用例又跑不通时,最有效的办法是反向读调用方代码,看它传什么、期待什么、失败时怎么处理。别只盯着异常本身。


















