【问题标题】:Is there any value in Python for which isinstance(value, object) is not True?Python 中是否存在 isinstance(value, object) 不为 True 的值?
【发布时间】:2012-03-27 06:11:33
【问题描述】:

据我了解,由于类型/类统一每个 值都是派生自object 的类型。但是我在文档中找不到绝对的确认。虽然 isinstance(anything, object) 应该始终是 True 是有道理的,但我也可以想象 Python 2 代码库中存在遗留的边缘情况。有谁知道isinstance(value, object) 不是 True 的例子?

上下文:作为我正在设计的类型层次结构的一部分,有一个包罗万象的Alpha 类型,我希望isinstance(obj, Alpha) 始终返回True。我认为在 Python 2.6+ 上 ABCMeta.register(object) 应该可以解决问题,但我想确定一下。

编辑:为了后代,ABCMeta.register(object) 将不起作用(尝试一下)。 Ethan Furman 在下面的回答中为这种情况提供了另一种解决方案。

【问题讨论】:

  • 一切都是object 的实例。在 C 级别有一些技巧可以使 type(object) 成为对象的实例。我现在没有参考资料,但在过去六个月的某个时候,有一篇关于此的博客文章。

标签: python python-2.x isinstance


【解决方案1】:

可以在非 Python 代码(例如C)中创建不派生自object 的类。

您应该能够通过将__subclasshook__ 添加到您的Alpha 来实现您想要的:

--> import abc
--> class Test(object):
...   __metaclass__ = abc.ABCMeta
...   @classmethod
...   def __subclasshook__(cls, C):
...     return True
...
--> isinstance(dict(), Test)
True
--> isinstance(42, Test)
True
--> isinstance(0.59, Test)
True
--> class old_style:
...     pass
...
--> isinstance(old_style(), Test)
True

【讨论】:

  • Hrm.. 但是任何纯 python 类型总是从对象派生?这可能已经足够好了,只要它也适用于常用/标准库 C 模块(cStringIO、cDecimal 等)
  • 除非他们仍在使用旧样式类——但如果这种区别不重要,您的 __subclasshook__ 可以忽略它(如示例所示)。
  • 太棒了!这看起来像是Alpha 的理想解决方案。谢谢伊森!
【解决方案2】:

在 2.x 中,用户定义的类(和一些 stdlib 类)默认情况下不从对象派生。这在 3.x 中已修复。

【讨论】:

  • 也许这就是 maaku 所说的“自从类型/类统一”的意思?
  • @WolframH:每个 literal 都是对象的一个​​实例。仍然可以(在 2.x 中)创建实例不是对象实例的类。
猜你喜欢
  • 2017-12-17
  • 2018-11-03
  • 1970-01-01
  • 2016-10-20
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-15
  • 2015-05-29
相关资源
最近更新 更多