¿Cómo verificar si el objeto es una instancia de una nueva clase definida por el usuario?

Código:

import types class C(object): pass c = C() print(isinstance(c, types.InstanceType)) 

Salida:

 False 

¿Cuál es la forma correcta de verificar si el objeto es una instancia de clase definida por el usuario para clases de nuevo estilo?

UPD:

Quiero poner énfasis adicional en verificar si el tipo de objeto está definido por el usuario . Según los documentos:

tipos.InstanciaTipo
El tipo de instancias de clases definidas por el usuario .

UPD2:

Bien, las formas no “correctas” también están bien.

UPD3:

También notó que no hay tipo para set en los types módulo

Puede combinar la comprobación x.__class__ con la presencia (o no) de '__dict__' in dir(x) o hasattr(x, '__slots__') , como una forma intrépida de distinguir entre la clase nueva / antigua y usuario / objeto incorporado.

En realidad, estas mismas sugerencias exactas aparecen en 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 

No estoy seguro de la forma “correcta”, pero una manera fácil de probarlo es que las instancias de las clases de estilo antiguo tienen el tipo ‘instancia’ en lugar de su clase real.

Entonces, el type(x) is x.__class__ o el type(x) is not types.InstanceType debería funcionar a la vez.

 >>> 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 

Esto nos dice verdad si lo es.

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

El segundo argumento es una tupla de las clases que deben verificarse. Esto es fácil de entender y estoy seguro de que funciona. [Editar (objeto) a (objeto,) gracias Duncan!]

Probablemente pueda isinstance(object, RightTypeAliasForThisCase) método de eliminación, no verificando si el objeto es una instancia de la clase definida explícitamente por el usuario, es instancia isinstance(object, RightTypeAliasForThisCase) , pero verificando si el objeto no es uno de los tipos “básicos”.