错误源于向 object.__init__() 传参,因其不接受任何参数;正确做法是 super().__init__() 不带参数或直接省略。

为什么继承 object 时会报这个错?
这个错误通常不是因为你直接调用了 object(),而是你在自定义类中重写了 __init__,但父类(比如显式继承的 object)没有接受参数的构造函数。Python 在你没写 super().__init__() 或误传参数给 object.__init__() 时,会抛出 TypeError: object() takes no parameters。
常见触发场景:class A(object): def __init__(self, x): super().__init__(x) —— 这里错在把 x 传给了 object.__init__(),而它根本不收任何参数。
-
object.__init__()确实不接受任何参数(包括self以外的),连super().__init__()都不能带参调用 - 如果你的类只继承
object(Python 3 中所有类默认隐式继承),且没其他父类,super().__init__()可以留空,也可以省略 - 如果父类是自定义类或内置类型(如
list,dict),要查清它的__init__签名,别默认套用object的规则
检查 super().__init__() 是否多传了参数
这是最常踩的坑。只要你在 super().__init__() 里写了任何参数(哪怕只是 super().__init__(None)),就会触发该错误。
正确写法取决于父类:
- 纯
object继承(无其他父类):super().__init__()必须不带参数,或直接删掉这一行 - 继承
list并想初始化内容:super().__init__([1,2,3])是合法的,因为list.__init__支持一个可选参数 - 继承多个类时,按 MRO 顺序检查第一个提供
__init__的父类,不要假设它是object
快速验证方法:运行 print(YourClass.__mro__),看 object 在哪一层、前面是否有其他类提供了 __init__。
Python 2/3 差异导致的隐式陷阱
Python 2 中写 class A: 是经典类,不继承 object;而 class A(object): 才是新式类。Python 3 中所有类都是新式类,class A: 等价于 class A(object):。但如果你混用旧代码或第三方库(尤其带 __metaclass__ 的),可能意外触发经典类行为或 MRO 异常。
- 在 Python 3 环境下,不必显式写
(object),写了也无害,但会强化“我需要控制父类初始化”的错觉,进而误加参数 - 用
isinstance(obj, object)总是返回True,但这不意味着object.__init__被调用了——它只在 MRO 链中轮到它时才执行,且永远不收参 - 如果用
type()动态创建类,确保__init__不向object传参,否则同样报错
调试时怎么快速定位问题行?
错误堆栈里通常会指出是哪一行调用了带参的 super().__init__() 或 object.__init__(),但有时被封装在装饰器或元类里,显得不直观。
- 在疑似出问题的
__init__开头加一句print(f"MRO: {type(self).__mro__}"),确认当前类的继承链 - 逐行注释掉
super()调用,看是否还报错;若不报了,说明就是它的问题 - 用
help(super().parent_class.__init__)(把parent_class换成实际类名)查文档,确认参数要求 - 注意 IDE 自动补全可能建议带参调用
super().__init__()—— 它不一定对,尤其当父类是object时
真正麻烦的往往不是语法错误,而是你以为父类需要初始化参数,其实它只是个空壳;或者你以为自己在调用某个业务父类的 __init__,结果 MRO 让 object 提前接锅了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











