11

代码:

import types


class C(object):
    pass


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

输出:

False

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

升级版:

如果检查对象的类型是否是用户定义的,我想进一步强调。根据文档:

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

UPD2:

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

UPD3:

set还注意到模块中没有类型types

4

4 回答 4

9

您可以将检查与orx.__class__的存在(或不存在)结合起来,作为区分新/旧样式类和用户/内置对象的一种hacky方法。'__dict__' in dir(x)hasattr(x, '__slots__')

实际上,这个完全相同的建议出现在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
于 2013-02-01T20:40:38.810 回答
7

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

所以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
于 2013-01-30T20:20:59.320 回答
1

这告诉我们 True 如果是这样。

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

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

于 2013-02-02T16:23:20.287 回答
0

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

于 2013-01-30T21:03:07.413 回答