2012-03-09 53 views
6

这是我的理解,因为类型/级别统一值是从object派生的类型。不过,我无法在文档中找到绝对的确认。虽然我认为isinstance(anything, object)应该始终是True,但我也可以想象在Python 2代码库中存在传统的边缘情况。有没有人知道isinstance(value, object)而不是True在isinstance(value,object)不是True的Python中是否有任何值?

背景:作为一个类型层次我设计的一部分,有一个为我想isinstance(obj, Alpha)总是返回True全encompasing Alpha类型。我在想Python 2.6+ ABCMeta.register(object)应该做的伎俩,但我想确定。

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

+0

一切都是'object'的一个实例。在C级别上有一些技巧甚至使'type(object)'成为对象的一个​​实例。我现在没有任何参考资料,但是在过去的六个月里,有一篇关于此的博客文章。 – agf 2012-03-09 20:00:44

回答

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 
+0

Hrm ..但任何纯python类型将始终从对象派生?这可能是足够好的了,只要它同样适用于常用/标准库C模块(cStringIO,cDecimal等) – maaku 2012-03-09 20:04:49

+0

除非它们仍然使用旧的类风格 - 但如果这种区分不重要,你的'__subclasshook__ '可以忽略它(例如)。 – 2012-03-09 20:10:10

+0

太棒了!这看起来像是'Alpha'的理想解决方案。谢谢Ethan! – maaku 2012-03-09 20:26:15

0

在2.x中,用户定义的类(和几个STDLIB类)不从对象默认派生。这在3.x中得到了修复。

+0

Mayby这是maaku意为“自从类型/阶级统一”的意思吗? – WolframH 2012-03-09 20:21:35

+0

@WolframH:每个* literal *是一个对象的实例。它仍然(在2.x中)可能创建其实例不是对象实例的类。 – 2012-03-09 20:29:07

相关问题