python 3 中 class a: 与 class a(object): 完全等价,因所有类默认隐式继承 object;可正常使用 super()、__mro__、__slots__ 等功能,但 object.__init__() 不接受参数,误传会导致 typeerror。

Python 3 中不写 object 也能正常工作,是因为所有类默认隐式继承 object——这不是“凑巧能用”,而是语言设计的强制约定。
Python 3 所有类自动是新式类
从 Python 3 开始,class A: 和 class A(object): 在运行时完全等价。解释器会在类创建时自动把 object 插入到 __mro__ 的末尾:
class A:
pass
print(A.__mro__)
# 输出: (<class>, <class>)</class></class>
这意味着你随时能用 super()、访问 __mro__、使用 __slots__、正确参与 isinstance() 判断——这些功能不再依赖你是否手写 (object)。
常见错误现象:
- 在 Python 2 环境下跑
class A:,super(A, self)报TypeError: super() argument 1 must be type, not classobj - 误以为 “没写
object就不是新式类”,结果在 Python 3 里白加了一层冗余声明
显式写 (object) 唯一有用的场景
它不改变行为,只服务于外部约束或信号传递:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 代码需同时支持 Python 2.7:此时
class A(object):是唯一能获得新式类语义的写法 - 团队静态检查(如 mypy)对空继承提示模糊,加
(object)可绕过missing-base-class警告 - 避免被误读为“漏写父类”:比如本该继承
Exception却只写了class MyError:,加(object)至少表明“我确认这是顶层类”
注意:object 不提供可被覆盖的初始化逻辑——object.__init__() 不接受任何参数。所以如果你写了 super().__init__(x),不管有没有显式继承 object,都会触发 TypeError: object() takes no parameters。
容易踩的坑:以为写了 (object) 就能控制初始化流程
很多人看到 class A(object): 就下意识在 __init__ 里调用 super().__init__(...),但这是错的:
-
object.__init__()签名是def __init__(self),**不允许任何额外参数** - 如果类只继承
object(即无其他父类),super().__init__()可以省略,或必须不带参数调用 - 真正要传参的,是你的自定义父类或内置类型(如
list、dict),不是object
验证方法很简单:print(YourClass.__mro__),看 object 是不是最后一个;如果不是,前面那个类才决定 super().__init__() 该传什么。
最常被忽略的一点:你几乎不需要直接和 object 打交道,但它提供的默认方法(比如 __str__)返回的是 <__main__.a object at></__main__.a> 这种地址字符串。一旦忘了重写,日志里就只剩内存地址——这不是继承机制的问题,而是对 object 行为预期不足。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










