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?
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 .
Bien, las formas no “correctas” también están bien.
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”.