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

Python类定义中object基类与type类的区别相关疑问

核心结论

object和type完全不是同一个类,二者是Python面向对象体系里两个定位完全不同的底层基石,你混淆了类的继承关系和类的实例创建关系两个完全独立的概念。


二者的定位差异

1. object:所有类的终极父类

object是整个Python继承体系的顶点,所有类——不管是内置的int、str、list,还是你自定义的类,甚至是type本身——追根溯源的继承链顶端都是object。
它定义了所有Python对象都应该具备的通用方法,比如__str__(打印对象时的逻辑)、__repr__(对象的官方字符串表示)、__eq__(相等判断逻辑)、__hash__(哈希值计算)等。
你可以用类的__mro__属性(方法解析顺序,即类的完整继承链)验证:

class My(object):
    pass

print(My.__mro__)
# 输出:(<class '__main__.My'>, <class 'object'>)
print(type.__mro__)
# 输出:(<class 'type'>, <class 'object'>)

可以看到,连type自己都是object的子类。

2. type:所有类的元类

type是Python默认的元类,也就是用来创建类的类。你用class关键字定义类的本质,就是Python自动调用type,生成了一个类对象。
它负责管控所有类的创建行为、类作为对象本身的属性和方法。你可以通过type()函数查看任意对象的创建者,所有类的创建者都是type:

print(type(My))       # 输出 <class 'type'>
print(type(int))      # 输出 <class 'type'>
print(type(object))   # 输出 <class 'type'>
print(type(type))     # 输出 <class 'type'>,type是自举创建的

你的疑问解答

为什么打印类的类型返回<class 'type'>而非<class 'object'>?

因为type(类名)查询的是*「这个类对象是被谁创建出来的」*,也就是实例关系,和继承关系没有关联。

你可以简单理解为:继承是「父子传承关系」,描述类之间的属性、方法传递逻辑;元类实例是「生产制造关系」,描述谁负责生成这个对象。

举个直白的例子:你可以从父亲那里继承姓氏、性格特征,这是继承关系;但你是母亲生育的,这是创建关系,二者完全不冲突。
对应到Python的规则:

  • 你自定义类生成的普通实例,type(实例)返回你的自定义类,同时isinstance(实例, object)返回True——因为实例所属的类最终继承自object
  • 你的自定义类本身,type(类)返回type,同时isinstance(类, object)也返回True——因为类作为对象,它的所属类type本身是object的子类

为什么不能写class My(type):?

这个写法是完全合法的Python语法,根本不存在不能写的问题,只是写了之后My就不是普通的业务类了,而是一个自定义元类。

  • 当你写class My(object)时,My是普通类,用途是生成普通的业务实例,你可以直接写obj = My()创建实例
  • 当你写class My(type)时,My继承了type的元类能力,用途是创建其他类,不能直接调用它生成普通业务实例,否则会报错。示例:
class MyMeta(type):
    # 可以在这里自定义类创建时的逻辑,比如自动给类加特定方法、校验类属性
    pass

# 用自定义元类创建业务类
class MyClass(metaclass=MyMeta):
    pass

# 错误用法:直接调用元类生成普通实例会触发类型错误
# obj = MyMeta()

很多新手误以为这个写法报错,本质是没搞懂元类的使用场景,把用来「造类」的元类,当成了用来「造普通实例」的普通类用,才会出问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 02:24:20