isinstance() 和 issubclass() 返回冲突的结果

新手上路,请多包涵

你如何解释 isinstance(Hello,object) 返回 Trueissubclass(Hello,object) 返回 False

 >>> class Hello:
    pass

>>> isinstance(Hello,object)
True
>>> issubclass(Hello,object)
False
>>> a = Hello()
>>> isinstance(a,object)
True

原文由 Tarik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 408
2 个回答

这是因为您使用的是旧式类,所以它不是派生自 object 。试试这个:

 class Hello(object):
    pass

>>> issubclass(Hello,object)
True

旧式类已弃用,您不应再使用它们。

在 Python 3.x 中,所有类都是新式的,不再需要编写 (object)

原文由 Mark Byers 发布,翻译遵循 CC BY-SA 3.0 许可协议

接受的答案是正确的,但似乎遗漏了重要的一点。内置函数 isinstanceissubclass 提出了两个不同的问题。

isinstance (object, classinfo) 询问 对象 是否是 __(或类的元组)的实例。

issubclass (class, classinfo) 询问一个 是否是另一个类(或其他类)的子类。

在任一方法中, classinfo 都可以是“类、类型或类、类型和此类元组的元组”。

因为类本身就是对象,所以 isinstance 应用得很好。我们还可以询问一个类是否是另一个类的子类。但是,我们不应该期望从两个问题中得到相同的答案。

 class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)
#>True
isinstance(Bar, Foo)
#>False

Bar 是 Foo 的子类,而不是它的实例。 Bar 是 type 的实例,它是 object 的子类,因此类 Bar 是 object 的实例。

 isinstance(Bar, type)
#>True
issubclass(type, object)
#>True
isinstance(Bar, object)
#>True

原文由 cbare 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题