python 3.12 正式引入 @override 装饰器(pep 698),需从 typing 导入并配合 mypy/pyright 等类型检查器使用,仅作静态校验,运行时无约束力。

@override 装饰器在 Python 3.12 中不是“废弃”,而是正式内置、但必须配合类型检查器才能起作用——不配 mypy 或 pyright,它就只是个空装饰器,毫无约束力。
@override 不生效的典型现象
- 子类方法签名和父类不一致(比如参数名改了、缺了默认值),但运行时没报错、IDE 也没提示
- 代码里写了
@override,却一直收不到任何警告或错误 -
mypy报error: @override used with non-overridden method,但你确认是重写了
这些都不是语法错误,而是使用姿势不对导致的失效。
- 必须从
typing导入:from typing import override(不是typing_extensions) - 父类方法必须有类型注解(哪怕只写
-> None),否则mypy无法识别“被重写”关系 - 父类不能是
object或无显式定义的方法(比如动态添加的setattr(cls, 'method', ...)) - 如果用的是
pyright,需确保配置中启用了enableTypeChecking和reportOverrideIssue
@override 和旧装饰器写法的区别
Python 3.12 并没有废弃某个“旧版 @override”,而是首次把 @override 放进标准库。此前所有用法都来自 typing_extensions,行为一致,但:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
-
typing_extensions.override在 3.12 中仍可用,但属于冗余导入 - 若项目同时装了
typing_extensions>=4.8.0和 Python 3.12+,直接用from typing import override更干净 - 不存在“旧写法被禁用”的情况,但混用(比如
from typing_extensions import override+from typing import override)可能触发 linter 冲突
类型检查器版本必须匹配
@override 的校验逻辑完全由静态检查器实现,Python 解释器本身不干预。
-
mypy需 ≥ 1.5.1 才支持 PEP 698(即@override的语义) -
pyright需 ≥ 1.1.330(2023 年后版本基本都满足) - 运行
mypy --version确认,低于版本会静默忽略@override,不报错也不警告
容易被忽略的细节
-
@override只校验方法签名一致性,不校验文档字符串、函数体逻辑或返回值实际类型 - 如果父类方法是
@staticmethod或@classmethod,子类重写时也必须加对应装饰器,否则mypy会报错 - 使用协议(
Protocol)时,@override对协议实现无效——协议成员不参与继承链校验
真正关键的不是“写没写 @override”,而是你有没有让类型检查器跑起来、父类有没有可推导的类型签名、以及检查器版本够不够新。漏掉其中任一环,它就等于没存在过。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










