2012-03-03 11 views
10

Para determinar la clase, puedo hacerlo:Cómo determinar el tipo de instancia de clase

class A: pass  
a = A 

type(A) is type #True 

o:

import inspect 
inspect.isclass(A) 

Pero cómo determinar el tipo de instancia de clase, sin saber el ¿nombre de la clase?

Algo como esto:

isinstance(a, a.__class__.__name__) 
#TypeError: isinstance() arg 2 must be a type or tuple of types 

he encontrado una solución, pero no funciona con Python 3x

import types 

class A: pass 
a = A() 

print(type(a) == types.InstanceType) 
#AttributeError: 'module' object has no attribute 'InstanceType' 

Solución:

if '__dict__' in dir(a) and type(a) is not type: 
+0

¿Está preguntando cómo determinar si un objeto es una clase o una instancia de una clase? – grifaton

+0

InstanceType son clases antiguas, que no existen en 3.x. –

+0

@grifaton, quiero distinguir la clase de la instancia – Opsa

Respuesta

11

type(a) es el tipo de la instancia, es decir, su clase. a.__class__ es también una referencia a la clase de la instancia, pero debe usar type(a).

types.InstanceType es solo para las clases antiguas en las versiones de Python pre-3.0, donde todas las instancias tienen el mismo tipo. Debería utilizar clases de estilo nuevo (derivado de object) en 2.x. En Python 3.0, todas las clases son de estilo nuevo.

+1

tipo (a) solo funciona para clases de nuevo estilo! Si está usando clases antiguas: vea si puede cambiarlas a nuevas. De lo contrario, use una .__ class__ que también funciona con estilo antiguo. La respuesta de @ kindall alude a esto ya, pero pensé en desempaquetar esto para las personas. –

1

Es debido a que la las instancias de clase antiguas son todas InstanceType, en Python 3.x solo hay n clases de estilo ew, que son lo mismo que tipos. Entonces a será tipo A en Python 3.x. Entonces no hay necesidad de incluir InstanceType, por lo que ya no existe.

13

Su pregunta no está nada clara. Desea determinar el "tipo de instancia de clase". Esto puede significar dos cosas. O desea determinar si una instancia es una instancia de una clase específica. Usted puede hacer que de este modo:

>>> isinstance(a, A) 
True 

También puede obtener la clase con la llamada type(), pero que por lo general no es muy útil:

>>> type(a) 
<class '__main__.A'> 

Pero las pruebas que demuestren que no mira esto . En su lugar, comprueban qué tipo es la clase . Pero Python 3 solo tiene un tipo de clase. Python 2 y ambas clases de "estilo antiguo" y "nuevo estilo", pero Python 3 solo tiene clases de estilo nuevo, por lo que no es necesario hacer este tipo de control en Python 3.

También puede usar metaclases. En ese caso se puede encontrar la metaclase comprobando la clase de __class__:

>>> from abc import ABCMeta 
>>> class B(metaclass=ABCMeta): pass 
>>> type(B) 
<class 'abc.ABCMeta'> 

Desde sus comentarios, sin embargo, parece que se quiere determinar si un objeto es una instancia o no. Habrías obtenido mejores respuestas si hubieses preguntado eso ...

De todos modos, para ello se utiliza inspect.isclass:

>>> import inspect 
>>> inspect.isclass(a) 
False 
>>> inspect.isclass(A) 
True 

Esto se debe a que todo es una instancia:

>>> isinstance(type, type) 
True 

Pero no todo es una clase.

Cuestiones relacionadas