Cómo determinar el tipo de un objeto en Python

How to Determine the Type of an Object in Python?

Planteamiento del problema

Cada objeto de Python es de un cierto tipo, también llamado “clase”. La clase es un esquema que muestra los datos y capacidades de cada objeto/instancia que se crea a partir de este esquema.

Dado un objeto de Python (=instancia). ¿Cómo determinar/comprobar/obtener su tipo (=clase)?

Hay muchas variantes de esta pregunta:

  • Cómo determinar el tipo de un objeto
  • Cómo comprobar el tipo de una instancia
  • Cómo obtener la clase de un objeto
  • Cómo comprobar la clase de una instancia

Empecemos con un breve resumen de cómo puedes responder a todas ellas de la forma más pitónica.

Descripción general de la solución

En Python, las funciones integradas type() e isinstance() te ayudan a determinar el tipo de un objeto.

  • type(objeto) – Devuelve una representación de cadena del tipo del objeto.
  • isinstance(objeto, clase) – Devuelve un booleano True si el objeto es una instancia de la clase, y False en caso contrario.

Aquí hay dos ejemplos para comprobar si un objeto es una lista:

>>> type([1, 2, 3])
<class 'list'>
>>> isinstance([1, 2, 3], list)
True

Usarías type() para determinar el tipo exacto de un objeto. Utilizarías isinstance() para confirmar tus conjeturas sobre el tipo de un objeto. La función isinstance() es más robusta en el sentido de que no depende de pequeñas diferencias de cadena, y también funciona con la herencia de tipos. Por ejemplo, si A hereda de B que hereda de C, un objeto de tipo C es también una instancia de A.


ejemplos de type() con un argumento de objeto:

>>> type([1, 2, 3]) is list
True
>>> type({1, 2, 3}) is set
True
>>> type('123') is str
True
>>> type(0) is int
True

type() con objetos personalizados:

>>> class Animal:
    pass

>>> class Snake(Animal):
    pass

>>> a = Animal()
>>> b = Snake()
>>> type(a) is Animal
True
>>> type(b) is Snake
True
>>> type(b) is Animal
False

El tercer ejemplo type(b) is Animal nos lleva a la siguiente conclusión:

💡 Idea: type() devuelve sólo el tipo inmediato de un objeto, pero no funciona con herencia.

Si quieres superar esta limitación, debes utilizar la función isinstance(), que también funciona para los tipos heredados:

>>> isinstance(Snake(), Animal)
True

También puedes usarlo en objetos y tipos integrados, como listas, tuplas, conjuntos y diccionarios:

>>> isinstance([1, 2, 3], list)
True
>>> isinstance((1, 2, 3), tuple)
True
>>> isinstance({1: 'a', 2: 'b'}, dict)
True
>>> isinstance({1, 2, 3}, set)
True

El único caso de uso en el que preferirías type() a isinstance() es si realmente necesitas la representación de cadena del tipo de un objeto. De lo contrario, isinstance() es una función más flexible y expresiva.

type() vs isinstance()

La diferencia entre type() e isinstance() es el valor devuelto que es una representación de cadena para el primero y un valor booleano para el segundo. Usarías la función type() si no supieras nada. Si ya sospechas que un objeto es de un tipo determinado (=clase), puedes confirmar tu suposición utilizando la función isinstance().

Función de Python type()

La función integrada type() de Python tiene dos propósitos. Primero, puede pasar un objeto como un argumento para comprobar el tipo de este objeto. En segundo lugar, puede pasar tres argumentos (nombre, bases y dict) para crear un nuevo objeto de tipo que se puede usar para crear instancias de este nuevo tipo.

A continuación se muestra cómo usar la función type() con un argumento para comprobar el tipo de un objeto determinado:

>>> type(42)
<class 'int'>
>>> type('Finxter')
<class 'str'>

Sintaxis:

type(objeto)         # Devuelve la representación de la clase del objeto
ArgumentosobjectObjeto del que se comprueba el tipo.
Valor de retornostringDevuelve la representación de cadena de la clase del objeto.

Tutorial relacionado: Función de Python type()

Función isinstance() de Python

La función isinstance(objeto, clase) incorporada de Python toma un objeto y una clase como argumentos de entrada. Devuelve True si el objeto es una instancia de la clase. De lo contrario, devuelve False. En lugar de una clase, también puedes pasar una tupla de clases para comprobar si el objeto es una instancia de cualquiera de las clases en la tupla, como en isinstance(objeto, (clase_A, clase_B, ...)).

¡Aprende con el ejemplo! Aquí tienes un ejemplo sobre cómo usar la función incorporada isinstance().

>>> isinstance(42, int)
True
>>> isinstance(42, (float, list, int))
True
>>> isinstance('42', (float, list, int))
False

Sintaxis:

isinstance(objeto, clase)         # Comprueba si el objeto es una instancia de clase
isinstance(objeto, (clase_A, clase_B, ...)) # Comprueba si el objeto es una instancia de cualquiera de las clases en la tupla
ArgumentosobjectObjeto del cual se debe comprobar la pertenencia a la clase.
clase o tupla de clasesClase o tupla de clases a las que este objeto puede o no pertenecer.
Valor de retornobooleanoDevuelve si el objeto pertenece a la clase (o a las clases) o no.