Python 3.11 中 Self 必须从 typing 显式导入,仅适用于实例方法,返回类型统一用 -> Self 可实现继承链中自动适配,类方法需用 Type[Self],静态方法不支持 Self。

Python 3.11 中 Self 类型注解必须显式导入
不导入就用 Self,类型检查器(如 mypy)会直接报错 NameError: name 'Self' is not defined 或 error: Name 'Self' is not defined。Python 3.11 原生支持 Self,但它不在内置命名空间里,得从 typing 显式导入。
实操建议:
立即学习“Python免费学习笔记(深入)”;
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 在模块顶部加
from typing import Self(注意不是from typing_extensions import Self,后者是为旧版本兼容准备的) - 如果项目还需支持 Python typing_extensions +
if TYPE_CHECKING:保护导入 -
Self只能用于方法签名中返回类型或参数类型,不能用作变量注解或类属性类型(会触发 mypy 错误Invalid use of Self)
链式调用场景下必须用 Self 替代 None 或类名
写 fluent interface(比如构建器模式)时,若返回 None 或硬编码类名(如 -> Builder),子类继承后方法返回类型就无法自动适配——子类调用父类方法,类型检查器仍认为返回的是父类,导致链式调用中断。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 把所有意图返回“当前实例”的实例方法返回类型统一改成
-> Self - 例如:
def set_name(self, name: str) -> Self:,这样Child().set_name("x")的类型就是Child,不是Parent - 避免混用:不要一部分方法用
-> Self,另一部分用-> "ClassName",mypy 会警告类型不一致
Self 在类方法和静态方法中无效
Self 表示“当前实例类型”,只对绑定到实例的方法(即带 self 参数的常规实例方法)有意义。类方法(@classmethod)的第一个参数是 cls,静态方法(@staticmethod)甚至没有隐式参数——这两者都不能用 Self 作为返回类型。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 类方法想返回当前类的实例,用
-> Type[Self](需额外导入Type)或更稳妥的-> Type["ClassName"] - 静态方法无法推导“当前类”,只能显式写字符串字面量注解,如
-> "MyClass",或依赖运行时逻辑 - 误写
@classmethod def create(...) -> Self:会导致 mypy 报错Invalid use of Self in classmethod
继承链中 Self 自动适配,但别忘了重写方法签名
Self 的妙处在于它随实际调用者动态变化:子类实例调用继承来的、返回 Self 的方法,类型检查器会把返回类型解析为子类本身。但这仅在方法未被重写时成立;一旦子类重写了该方法,就必须显式保持 -> Self 注解,否则适配失效。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 子类重写父类中返回
Self的方法时,必须复制相同的返回注解:def method(self) -> Self: - 如果子类方法逻辑不变,可用
pass占位但保留签名(含注解),或直接不重写 - 漏写
-> Self会导致 mypy 认为返回的是Any或父类类型,链式调用后续步骤类型丢失
Self,mypy 默认不会检查方法体内部是否真的返回了 self;你得靠 --disallow-incomplete-defs 或手动校验逻辑,否则注解和实现脱节,类型安全就形同虚设。

















