Как проверить, является ли объект экземпляром нового пользовательского класса?

код:

import types


class C(object):
    pass


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

выход:

False

как правильно проверить, является ли объект экземпляром пользовательского класса для классов нового стиля?

UPD:

Я хочу поставить дополнительный акцент, если проверка, если тип объекта пользовательские. Согласно документам:

типы.InstanceType
Тип экземпляров пользовательские занятия.

UPD2:

хорошо-не "правильные" способы тоже в порядке.

UPD3:

также заметил, что нет типа set в модуле types

4 ответов


вы можете комбинировать x.__class__ проверьте наличие (или нет) либо '__dict__' in dir(x) или hasattr(x, '__slots__'), как хакерский способ различать как новый / старый класс стиля, так и объект user/builtin.

на самом деле, это точно такие же предложения появляются в 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

Я не уверен в "правильном" способе, но один простой способ проверить, что экземпляры классов старого стиля имеют тип "экземпляр" вместо их фактического класса.

Так 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

Это говорит нам правду, если это так.

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

второй аргумент является кортежем классов, которые необходимо проверить. Это легко понять, и я уверен, что это работает. [edit (object) to(object,) спасибо Дункан!]


вероятно, я могу пойти с методом исключения-не проверяя, является ли объект экземпляром пользовательского класса явно -isinstance(object, RightTypeAliasForThisCase), но проверка, если объект не один из "основных" типов.