Как проверить, является ли объект экземпляром нового пользовательского класса?
код:
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)
, но проверка, если объект не один из "основных" типов.