Python 中定义类为什么要继承 object?

Python 3 中所有类默认继承 object,显式写出只是历史习惯(Python 2 新式类与旧式类之分)。本文解释这段历史与 object 提供的通用方法。

最佳实践
Python 中定义类为什么要继承 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 对象模型自举的环。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台