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

如何在Python中复刻object与type的“基类与实例”关系?

如何模拟object与type的循环依赖关系来声明自定义类?

在Python里,object是所有类的基类,type是所有类的元类,而且isinstance(object, type)和issubclass(type, object)都返回True,形成了特殊的循环依赖。如果想自定义MyObject和MyType复刻这种关系,常规的类定义方式会因为循环引用报错——定义MyObject需要MyType存在,定义MyType又需要MyObject存在。

解决这个问题可以分三步操作,利用Python类的动态特性避开循环依赖:

  • 先声明一个空的MyType类占位,让后续定义MyObject时能找到类名
  • 定义MyObject类,指定元类为MyType
  • 修改MyType的__bases__属性,补全它继承MyObject和type的关系

完整代码如下:

# 1. 先创建空的MyType类作为占位
class MyType:
    pass

# 2. 定义MyObject,元类设置为MyType
class MyObject(metaclass=MyType):
    pass

# 3. 修改MyType的基类,让它同时继承MyObject和type
MyType.__bases__ = (MyObject, type)

验证一下最终的关系是否符合预期:

print(isinstance(MyObject, MyType))  # True,MyObject的元类是MyType
print(issubclass(MyType, MyObject)) # True,MyType继承自MyObject
print(isinstance(MyType, type))     # True,MyType同时继承了type,所以它的元类是type
print(isinstance(MyType, MyType))   # True,因为type的元类是自身,MyType继承type后也满足这个特性

原理很简单:Python在定义类时,只检查类名是否已存在,不要求类的完整定义。先创建空的MyType让MyObject能正常初始化,之后通过修改__bases__动态调整MyType的继承关系,就能完美复刻object和type之间的循环依赖特性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 05:32:03