如何在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
相关产品推荐
相关产品推荐

