9.1 Función type()
En Python hay varias funciones integradas para chequear tipos y clases de objetos. Estas funciones son útiles para escribir código flexible y seguro, que pueda trabajar con diferentes tipos de datos.
A continuación te hablaré de las más populares: type()
,
isinstance()
, issubclass()
, así como funciones para
la anotación de tipos, como getattr()
y hasattr()
.
Función type()
La función type()
devuelve el tipo de un objeto. Ya has trabajado con ella,
¿verdad?
x = 10
print(type(x)) # Salida: <class 'int'>
Pero lo que probablemente no sabes es que también puedes crear nuevos clases con ella!
Creación de una nueva clase
Si le pasas tres argumentos, creará un nuevo tipo (clase).
La firma de esta operación es:
type(name, bases, dict)
donde:
-
name
— el nombre de la clase que se crea (cadena). -
bases
— una tupla de clases base (padres), de las cuales la nueva clase heredará. -
dict
— un diccionario que contiene los atributos y métodos de la nueva clase.
Creación de una clase simple:
MyClass = type('MyClass', (), {'say_hello': lambda self: print("Hello!")})
# Creamos una instancia de la clase
instance = MyClass()
instance.say_hello() # Salida: Hello!
Incluso puedes crear algo más complejo:
MyClass = type('MyClass', (), {
'attribute': 42,
'__init__': lambda self, value: setattr(self, 'value', value),
'display_value': lambda self: print(self.value)
})
# Creamos una instancia de la clase
instance = MyClass(10)
print(instance.attribute) # Salida: 42
instance.display_value() # Salida: 10
Así que ahora no solo puedes determinar el tipo de un objeto, sino también crear una clase, hacerle objetos y luego determinar sus tipos.
9.2 Función isinstance()
Función isinstance()
es una función incorporada
en Python usada para verificar si un objeto pertenece a
una clase específica o a una tupla de clases. Retorna True
si el objeto
es una instancia de la clase especificada o
cualquiera
de las clases especificadas en la tupla, y False
en caso contrario.
Firma y parámetros:
isinstance(object, classinfo)
donde:
-
object
— el objeto cuya pertenencia a la clase o clases necesitas verificar. -
classinfo
— clase, tipo o tupla de clases y tipos contra los cuales se verificará el objeto.
Ejemplos de uso:
Verificación de pertenencia a una clase
x = 10
print(isinstance(x, int)) # Salida: True
y = "Hello"
print(isinstance(y, str)) # Salida: True
Verificación de pertenencia a múltiples clases — al menos a una de:
x = 10
print(isinstance(x, (int, float))) # Salida: True
y = "Hello"
print(isinstance(y, (int, str))) # Salida: True
z = 3.14
print(isinstance(z, (int, str))) # Salida: False
Verificación de pertenencia a clases personalizadas
class Animal:
pass
class Dog(Animal):
pass
dog = Dog()
print(isinstance(dog, Dog)) # Salida: True
print(isinstance(dog, Animal)) # Salida: True
A diferencia de la comparación directa de tipos usando type()
,
isinstance()
trabaja correctamente con la herencia, verificando la pertenencia de un objeto a cualquier
clase en la jerarquía.
9.3 Función issubclass()
Función issubclass()
es una función incorporada
en Python que se utiliza para verificar si una clase
es una subclase de otra clase o de cualquiera de las clases en una tupla. Esta función
devuelve True
si el primer argumento es de hecho una subclase
del segundo, y False
en caso contrario.
Firma y parámetros:
issubclass(class, classinfo)
donde:
-
class
— la clase cuya pertenencia a otra clase o clases necesitas verificar. -
classinfo
— clase, tipo o tupla de clases y tipos contra los cuales se verificará el primer argumento.
Ejemplos de uso:
Verificación de pertenencia a una clase
class Animal:
pass
class Dog(Animal):
pass
print(issubclass(Dog, Animal)) # Salida: True
print(issubclass(Animal, Dog)) # Salida: False
Verificación de pertenencia a múltiples clases — al menos a una de:
class Animal:
pass
class Dog(Animal):
pass
class Cat(Animal):
pass
print(issubclass(Dog, (Animal, Cat))) # Salida: True
print(issubclass(Dog, (Cat,))) # Salida: False
Ejemplos con clases personalizadas
Herencia de clases integradas
class MyInt(int):
pass
print(issubclass(MyInt, int)) # Salida: True
print(issubclass(int, MyInt)) # Salida: False
Jerarquía de herencia
class A:
pass
class B(A):
pass
class C(B):
pass
print(issubclass(C, A)) # Salida: True
print(issubclass(C, B)) # Salida: True
print(issubclass(B, A)) # Salida: True
print(issubclass(A, C)) # Salida: False
Ventajas de usar issubclass()
Verificación de jerarquía de clases:
issubclass()
permite verificar la jerarquía de clases, lo cual es útil
para asegurar la corrección de la herencia y la estructura del código.
Flexibilidad: La función soporta la verificación de una clase o una tupla de clases, lo que la hace flexible para su uso en diversos escenarios.
Comodidad para metaprogramación:
issubclass()
se usa frecuentemente en metaprogramación y al
escribir código que trabaja con tipos y clases dinámicos. Pero eso
lo veremos más adelante :)
GO TO FULL VERSION