En Python, las funciones incorporadas type() e isinstance() se utilizan para obtener y comprobar el tipo de un objeto, como una variable, y para determinar si es de un tipo determinado.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Aquí se explican los siguientes contenidos, junto con un código de ejemplo.
- Obtener y comprobar el tipo de objeto:
type()
- Determinación del tipo de objeto:
type()
,isinstance()
- Determinación del tipo mediante type()
- Determinación del tipo mediante isinstance()
- Diferencia entre type() y isinstance()
En lugar de determinar el tipo de un objeto, se puede utilizar el manejo de excepciones o la función incorporada hasattr() para determinar si un objeto tiene los métodos y atributos correctos.
Obtener y comprobar el tipo de objeto: tipo()
type(object) es una función que devuelve el tipo del objeto pasado como argumento. Se puede utilizar para averiguar el tipo de un objeto.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
El valor de retorno de type() es un objeto de tipo como str o int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Determinación del tipo de objeto: type(), isinstance()
Utilice type() o isinstance() para determinar el tipo.
Determinación del tipo mediante type()
Comparando el valor de retorno de type() con un tipo arbitrario, se puede determinar si el objeto es de cualquier tipo.
print(type('string') is str)
# True
print(type('string') is int)
# False
def is_str(v):
return type(v) is str
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
Si quiere determinar si es uno de varios tipos, utilice el operador in y una tupla o lista de varios tipos.
def is_str_or_int(v):
return type(v) in (str, int)
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
También es posible definir funciones que cambien el procesamiento dependiendo del tipo de argumento.
def type_condition(v):
if type(v) is str:
print('type is str')
elif type(v) is int:
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
Determinación del tipo mediante isinstance()
isinstance(objeto, clase) es una función que devuelve verdadero si el objeto del primer argumento es una instancia del tipo o subclase del segundo argumento.
El segundo argumento puede ser una tupla de tipos. Si es una instancia de cualquiera de los dos tipos, se devuelve true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Una función similar al ejemplo de la determinación del tipo mediante type() puede escribirse como sigue
def is_str(v):
return isinstance(v, str)
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
return isinstance(v, (int, str))
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
if isinstance(v, str):
print('type is str')
elif isinstance(v, int):
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
Diferencia entre type() y isinstance()
La diferencia entre type() e isinstance() es que isinstance() devuelve verdadero para las instancias de las subclases que heredan la clase especificada como segundo argumento.
Por ejemplo, se define la siguiente superclase (clase base) y subclase (clase derivada)
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
La determinación del tipo mediante type() devuelve verdadero cuando los tipos coinciden, pero isinstance() devuelve verdadero incluso para las superclases.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Incluso para los tipos estándar, por ejemplo, el tipo booleano bool (true,false), hay que tener cuidado. bool es una subclase del tipo integer, por lo que isinstance() devuelve true incluso para un int del que se hereda.
print(type(True))
# <class 'bool'>
print(type(True) is bool)
# True
print(type(True) is int)
# False
print(isinstance(True, bool))
# True
print(isinstance(True, int))
# True
Si quiere determinar el tipo exacto, utilice type(); si quiere determinar el tipo teniendo en cuenta la herencia, utilice isinstance().
La función incorporada issubclass() también se proporciona para determinar si una clase es una subclase de otra clase.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False