
Python 3 中所有类默认都是新式类,class Person: 和 class Person(object): 完全等价,显式写 object 是冗余的,但不报错。
Python 3 中 class A: 就是新式类
Python 3 已彻底移除经典类。无论你写 class A:、class A(): 还是 class A(object):,解释器都会自动让 A 继承 object,且 A.__bases__ 永远包含 object。
验证方式:
>>> class A: pass >>> A.__bases__ (<class>) >>> type(A) <class> >>> isinstance(A(), A) True </class></class>
这说明:类本身是 type 的实例,实例的类型就是类本身(不是统一的 instance),这是新式类的核心特征。
super() 和 __mro__ 在 Python 3 中总是可用
只要用了 class 关键字定义的类,就支持 super() 调用和 __mro__ 属性——因为它们依赖新式类的 MRO(Method Resolution Order)机制。
-
super()在经典类中会抛出TypeError: must be type, not classobj,但在 Python 3 中永不触发 -
C.mro()返回的是 C3 线性化结果,比如class D(B, C): pass的 MRO 顺序严格按 C3 算法计算,不是简单“广度优先” - 即使你漏掉
object,D.mro()末尾也一定是object
__new__、__getattribute__、__slots__ 等特性默认生效
这些功能只存在于新式类中。在 Python 3 中,哪怕你一个父类都不写,也能直接用:
-
__new__总是存在,且在__init__之前被调用 -
__getattribute__替代了经典类中不稳定的__getattr__查找逻辑 -
__slots__可以限制实例属性,且不会因“非新式类”而静默失效
例如:
>>> class S: ... __slots__ = ['name'] >>> s = S() >>> s.name = 'alice' >>> s.age = 10 # AttributeError: 'S' object has no attribute 'age'
Python 2 的遗留写法在 Python 3 中只是“看起来多余”
很多项目仍保留 class A(object): 写法,主要出于两个现实原因:
- 保持与 Python 2 兼容(如果代码还需跑在 2.7 上)
- 团队风格统一,或作为显式信号:“这个类是完整的新式类语义”
但要注意:在纯 Python 3 环境下,它不带来任何行为差异,也不提升性能或安全性;反而可能误导新人以为 object 是“可选基类”。真正的关键点在于——MRO 行为、属性访问协议、实例类型这些底层机制,早已由解释器硬编码绑定到所有类上,和你写不写 object 无关。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











