Python 中定义类为什么要继承 object?
Python 3 中所有类默认继承 object,显式写出只是历史习惯(Python 2 新式类与旧式类之分)。本文解释这段历史与 object 提供的通用方法。
直接答案:在 Python 3 里,class MyClass: 和 class MyClass(object): 完全等价——所有类都自动继承 object,显式写出来只是从 Python 2 时代保留下来的习惯。Python 2 中存在"旧式类"(不继承 object)与"新式类"(继承 object)之分,行为有实质差别;这个区别在 Python 3 已彻底消失。
历史背景:Python 2 的新旧式类
Python 2.2 之前只有一种类(旧式类),之后引入了新式类,两者在方法解析顺序(MRO)、super()、property 描述符等行为上不同。要获得新式类必须显式写:
class MyClass(object): # Python 2 中这才是新式类
pass
于是"永远显式继承 object"成了兼容 Python 2/3 代码库的通行写法。
Python 3:一切都是新式类
class A:
pass
print(A.__mro__) # (<class 'A'>, <class 'object'>)
print(isinstance(A(), object)) # True
不写 (object),类照样继承 object,照样有 __init__、__repr__、__eq__ 等默认实现,MRO 也照样走 C3 线性化。
object 给了每个类什么
所有类都从 object 继承一组通用方法:
__init__/__new__:对象创建__str__/__repr__:字符串表示__eq__/__hash__:相等性与哈希__getattribute__/__setattr__:属性访问
这也是为什么任何对象都能 print()、能放进 dict 当 key(未重写时按身份比较)。
现在还要不要显式写?
- 纯 Python 3 项目:不写,更简洁,主流风格指南(如 Google、Black 格式化生态)都倾向省略。
- 维护 Python 2/3 兼容的老代码:继续写,保证 Python 2 下也是新式类。
常见问题(FAQ)
Q:不写 (object) 会影响 super() 吗?
A:不会。Python 3 的零参数 super() 在任何类里都可用。
Q:多继承的 MRO 与 object 有关吗?
A:object 始终位于 MRO 链末端;Python 3 所有类都用 C3 线性化计算 MRO,可用 类名.__mro__ 查看。
Q:object 和 type 是什么关系?
A:object 是所有类的基类,type 是所有类的元类;type(object) 是 type,object.__class__ 也是 type——这是 Python 对象模型自举的环。