You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python类定义何时继承object、何时不继承?求技术解答

Python类继承object的核心问题解析

你的基础理解是对的

object确实是Python中所有新式类的顶层基类——所有对象(包括类本身)最终都溯源到它。要不要显式把它写在类的继承列表里,核心看Python版本和你的类的使用场景:

分版本明确规则

Python 2

Python2里类分两种类型,差异很大:

  • 旧式类(经典类):不显式继承object,比如class cats():。这种类没有新式类的核心特性(比如__slots__、super()的正确多继承行为、属性描述符、__getattribute__方法等),而且继承查找逻辑是深度优先,复杂继承场景下容易出bug。
  • 新式类:显式继承object,比如class cats(object):。拥有所有现代Python类的特性,继承查找是广度优先,逻辑更符合直觉。

在Python2里,只要你的类需要用到新式类特性,或者后续可能被其他类继承,必须显式继承object;如果只是临时写个极其简单的一次性类,用旧式类也能跑,但强烈不推荐——旧式类的坑太多。

Python 3

Python3已经彻底统一了类模型:所有类默认都是新式类,不管你写不写object。

  • class cats():、class cats(object):、甚至class cats:(连括号都省了),这三种写法完全等价,都会自动继承object。

所以在Python3里,显式写object纯粹是编码风格问题,写不写都不影响功能,按团队的代码规范来就行。

你遇到的继承报错原因

你说“所有子类都继承object会报错”,99%是在Python2环境下的混合继承问题:比如父类是旧式类(没写object),子类却显式继承object,这会导致继承体系冲突。举个具体的错误例子:

# Python2环境下运行会报错
class Animal():  # 旧式类,没继承object
    pass
class Cat(object, Animal):  # 子类同时继承新式类基类和旧式类,冲突
    pass

解决方法很简单:在Python2中,要么所有类都显式继承object(统一用新式类),要么都不用,绝对别混合来。

而你说“移除子类中的object继承,单独使用子类会出问题”,应该是这个子类依赖了新式类的特性——比如用了super()调用父类方法,或者依赖__getattribute__、属性描述符这些功能,当它变成旧式类后,这些特性就无法正常工作了。

你的示例代码的语法问题

你的两段代码都有个致命语法错误:__init__方法的第一个参数必须是实例本身(惯例用self,你也可以换别的名字,但必须有这个参数)。你写的cats_name会被Python当成实例参数,导致你传猫的名字时会报错。正确写法应该是:

# Python3中两种写法完全等价
class cats():
    def __init__(self, cats_name):
        self.cats_name = cats_name

class cats(object):
    def __init__(self, cats_name):
        self.cats_name = cats_name

总结建议

  1. 如果你用Python3:完全不用纠结object的问题,写不写都一样,按团队规范来就行。
  2. 如果你还在维护Python2代码:所有类统一显式继承object,彻底避开旧式类的各种坑。
  3. 继承时保持体系一致:要么全是新式类,要么全是旧式类(仅Python2),混合继承必然报错。

内容的提问来源于stack exchange,提问作者mikejacobspython

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 08:48:21