旧式类因绕过object导致类型系统断裂、mro不可预测、super()失效,python 2中type与__class__脱节,isinstance不可靠,不支持__slots__、描述符及泛型;python 3已彻底移除,python 2迁移必须显式继承object。

object 是新式类的唯一根,而旧式类绕过了它,导致类型系统断裂、MRO 不可预测、super() 失效——这不是风格问题,是底层机制缺陷。
Python 2 中旧式类的 type 和 class 完全脱节
旧式类实例的 type(obj) 永远是 <type></type>,和 obj.__class__ 无关。这意味着你无法用 isinstance(obj, SomeClass) 做可靠判断,也无法把类当类型参与泛型或注解(哪怕只是写个 typing.Type[SomeClass] 都会错)。新式类则让 type(obj) is obj.__class__ 成立,这是现代 Python 类型系统的基础。
super() 在旧式类中根本不可用
调用 super(ClassA, self) 会直接抛出 TypeError: super() argument 1 must be type, not classobj。因为 super 内部依赖 __mro__,而旧式类压根没有这个属性。即使你手动实现类似逻辑,也得自己模拟 C3 线性化——没人真这么干,所以旧式类在多重继承场景下基本等于“放弃协作”。
旧式类的 MRO 是深度优先,且不支持 __slots__ 和描述符
- 旧式类使用简单但错误的深度优先搜索(DFS),遇到菱形继承时方法调用顺序混乱,比如
A(B, C)同时继承B(D)和C(D),D.method()可能被调用两次 -
__slots__在旧式类中被忽略,@property、@staticmethod、@classmethod也不起作用——这些不是“锦上添花”,而是构建封装、缓存、接口契约的基础设施 - 描述符协议(
__get__/__set__)完全失效,property底层就是靠它工作的
Python 3 彻底移除旧式类,但 Python 2 迁移必须显式继承 object
Python 3 所有类自动成为新式类,class A: 和 class A(object): 完全等价。但在 Python 2 中:
— class A: → 旧式类(默认)
— class A(object): → 新式类(必须显式写)
迁移时漏掉 (object),表面能跑,但一旦用到 super、isinstance、__slots__ 或任何框架的元编程逻辑,就会静默失败或行为异常。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











