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

Gil*_*tes 9 python python-2.x new-style-class

码:

import types


class C(object):
    pass


c = C()
print(isinstance(c, types.InstanceType))
Run Code Online (Sandbox Code Playgroud)

输出:

False
Run Code Online (Sandbox Code Playgroud)

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

UPD:

如果检查对象的类型是否是用户定义的,我想要额外强调.根据文件:

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

UPD2:

好吧 - 不是"正确"的方式也可以.

UPD3:

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

mmg*_*mgp 7

您可以结合x.__class__使用的任何存在(或不)检查'__dict__' in dir(x)hasattr(x, '__slots__')作为哈克的方式既新/旧样式类和用户/内建对象来区分.

实际上,这个完全相同的建议出现在/sf/answers/185836451/中

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
Run Code Online (Sandbox Code Playgroud)
>>> 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
Run Code Online (Sandbox Code Playgroud)


Ant*_*ony 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
Run Code Online (Sandbox Code Playgroud)