__init__ 必须返回 None,因其仅负责初始化已创建的实例,若返回非 None 值(如 return self)会触发 TypeError;常见错误包括显式 return、装饰器篡改返回值或 IDE 自动补全干扰。

__init__ 为什么不能 return 非 None?
Python 的 __init__ 是初始化方法,不是构造器本身——真正创建实例的是 __new__。所以 __init__ 的职责只是“给刚造好的对象填属性”,它**必须返回 None**。一旦你写了 return 42、return self 或任何非 None 值,Python 就会立刻抛出 TypeError: __init__() should return None, not 'int'。
哪些写法会触发这个 TypeError?
常见但容易被忽略的错误写法:
- 显式
return语句(哪怕只在某个分支里):if x: return "oops" - 忘了函数默认返回
None,误以为print()或赋值语句能“替代”返回,结果末尾多写了return self - 从其他函数复制粘贴代码时带入了
return value,没删干净 - 用装饰器包装
__init__,而装饰器本身返回了非None(比如返回了 wrapper 函数)
怎么快速定位和修复?
报错堆栈里会明确指出哪一行的 __init__ 返回了什么类型。重点检查:
- 所有
return语句——删掉,或改成return None(虽然冗余,但安全) - 有没有意外把
__init__写成类似工厂函数的风格,比如return cls(...)(那是__new__或类方法该干的事) - 如果用了装饰器(如
@dataclass、自定义验证装饰器),确认它没有篡改__init__的返回行为;必要时加return None显式兜底
示例错误写法:
class Person:
def __init__(self, name):
self.name = name
return self # ❌ 触发 TypeError
正确写法:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
class Person:
def __init__(self, name):
self.name = name
# ✅ 不写 return,或写 return None(可选)
为什么有人会想 return 非 None?
多数是混淆了 __init__ 和普通方法的用途:比如想链式调用 Person("Alice").set_age(30),就误在 __init__ 里 return self。这不可行——实例已经创建完毕,__init__ 没机会“变成”别的东西。真要链式,应该让 set_age 这类方法自己 return self,而不是动 __init__。
另一个常见误解是想用 __init__ 做校验失败时“拒绝创建实例”,但这属于 __new__ 或类方法(如 from_...)的职责;__init__ 抛异常可以,但绝不能靠 return 来跳过初始化。
最隐蔽的坑:某些 IDE 或 LSP 插件会在你敲完 def __init__ 后自动补全 return 模板,一不留神就中招。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










