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

11 投票
4 回答
5859 浏览
提问于 2025-04-17 14:14

代码:

import types


class C(object):
    pass


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

输出:

False

怎么正确检查一个对象是否是用户自定义类的实例,特别是对于新式类?

更新:

我想特别强调一下,检查对象的类型是否是用户自定义类。根据文档:

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

更新2:

好吧,"不正确"的方法也可以。

更新3:

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

4 个回答

1

这段话的意思是,如果条件成立,就会返回“真”。

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

第二个参数是一个元组,里面包含了要检查的类。这个很容易理解,我相信它是有效的。

[编辑:把(object)改成(object,),谢谢Duncan!]

7

我不太确定“正确”的方法是什么,但有一种简单的测试方式,就是老式类的实例类型是'instance',而不是它们实际的类。

所以你可以用 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
9

你可以把 x.__class__ 的检查和 '__dict__' in dir(x)hasattr(x, '__slots__') 的存在结合起来,这是一种比较“hacky”的方法,用来区分新旧风格的类和用户自定义对象与内置对象。

其实,这个建议在 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

撰写回答