如何检查对象是否是新式用户定义类的实例?

时间:2013-01-30 20:16:58

标签: python python-2.x new-style-class

代码:

import types


class C(object):
    pass


c = C()
print(isinstance(c, types.InstanceType))

输出:

False

检查对象是否为新式类的用户定义类的实例的正确方法是什么?

UPD:

如果检查对象类型是否为用户定义,我还要强调一下。根据文件:

  

types.InstanceType
         用户定义的类的实例类型。

UPD2:

好吧 - 不是“正确”的方式也可以。

UPD3:

另请注意,模块set

中没有types的类型

4 个答案:

答案 0 :(得分:7)

您可以将x.__class__检查与'__dict__' in dir(x)hasattr(x, '__slots__')的存在(或不存在)结合起来,作为区分新/旧式类和用户的hacky方式/ builtin object。

实际上,https://stackoverflow.com/a/2654806/1832154

中出现了完全相同的建议
def is_instance_userdefined_and_newclass(inst):
    cls = inst.__class__
    if hasattr(cls, '__class__'):
        return ('__dict__' in dir(cls) or hasattr(cls, '__slots__'))
    return False

>>> class A: pass
... 
>>> class B(object): pass
... 
>>> a = A()
>>> b = B()
>>> is_instance_userdefined_and_newclass(1)
False
>>> is_instance_userdefined_and_newclass(a)
False
>>> is_instance_userdefined_and_newclass(b)
True

答案 1 :(得分:6)

我不确定“正确”的方法,但测试它的一种简单方法是旧样式类的实例具有“实例”类型而不是实际类。

因此type(x) is x.__class__type(x) is not types.InstanceType都应该有效。

>>> class Old:
...     pass
...
>>> class New(object):
...     pass
...
>>> x = Old()
>>> y = New()
>>> type(x) is x.__class__
False
>>> type(y) is y.__class__
True
>>> type(x) is types.InstanceType
True
>>> type(y) is types.InstanceType
False

答案 2 :(得分:1)

这告诉我们是否真实。

if issubclass(checkthis, (object)) and 'a' not in vars(__builtins__):print"YES!"

第二个参数是要检查的类的元组。 这很容易理解,我确信它有效。 [编辑(对象)到(对象),感谢Duncan!]

答案 3 :(得分:0)

可能我可以使用消除方法 - 不检查对象是否是显式的用户定义类的实例 - isinstance(object, RightTypeAliasForThisCase),但检查对象是否不是“基本”类型之一。