您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

实例是“对象”,但类不是“对象”的子类:这怎么可能?

实例是“对象”,但类不是“对象”的子类:这怎么可能?

在Python 2中, 类型 不是同一对象,特别是对于老式类,type(obj)它与对象是不同的obj.__class__。因此这是可能的,因为老式类的实例实际上是instance与其类不同的类型():

>>> class A(): pass
>>> class B(A): pass
>>> b = B()

>>> assert b.__class__ is B
>>> issubclass(b.__class__, A) # same as issubclass(B, A)
True
>>> issubclass(type(b), A)
False

>>> type(b)
<type 'instance'>
>>> b.__class__
<class __main__.B at 0x10043aa10>

这在新型类中得以解决

>>> class NA(object): pass
>>> class NB(NA): pass
>>> nb = NB()
>>> issubclass(type(nb), NA)
True
>>> type(nb)
<class '__main__.NB'>
>>> nb.__class__
<class '__main__.NB'>

旧样式类不是类型,新样式类是:

>>> isinstance(A, type)
False
>>> isinstance(NA, type)
True

旧样式类被声明为已弃用。在Python 3中,只有新型类。class A()等效于class A(object)并且您的代码True在两次检查中产生。

看一下这个问题进行更多讨论:Python中旧样式类和新样式类之间有什么区别?

其他 2022/1/1 18:46:13 有454人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶