Objetos en Python

2 minutos de lectura

Programación orientada a objetos

Python también permite la programación orientada a objetos, que es un paradigma de programación en la que los datos y las operaciones que pueden realizarse con esos datos se agrupan en unidades lógicas llamadas objetos.

Los objetos suelen representar conceptos del dominio del programa, como un estudiante, un coche, un teléfono, etc. Los datos que describen las características del objeto se llaman atributos y son la parte estática del objeto, mientras que las operaciones que puede realizar el objeto se llaman métodos y son la parte dinámica del objeto.

La programación orientada a objetos permite simplificar la estructura y la lógica de los grandes programas en los que intervienen muchos objetos que interactúan entre sí.

Clases

# Creando una clase vacía
class Penguin:
    pass
 
# Creamos un objeto de la clase perro
mi_pinguino = Penguin()

Definiendo atributos

Es importante distinguir que existen dos tipos de atributos.

Atributos de instancia

Pertenecen a la instancia de la clase o al objeto. Son atributos particulares de cada instancia, en nuestro caso de cada perro.

Atributos de clase

Se trata de atributos que pertenecen a la clase, por lo tanto serán comunes para todos los objetos.

class Penguin:
    # Definiendo un atributo de clase
    clase = "Ave"
 
    # El método __init__ es llamado al crear el objeto
    def __init__(self, nombre, especie):
        print("Creando pingüino: " + "'" + nombre + "', " + especie)
 
        # Atributos de instancia
        self.nombre = nombre
        self.especie = especie
 
# Creando un pingüino
mi_pinguino = Penguin("Enrique", "Emperador")
 
# Viendo qué tipo de dato es mi_pinguino
print(type(mi_pinguino))
 
# Viendo qué clase de animal es
print(Penguin.clase)
print(mi_pinguino.clase)
print(mi_pinguino.nombre)
print(mi_pinguino.especie)

Definiendo métodos

En realidad, cuando usamos __init__ anteriormente ya estábamos definiendo un método, solo que uno especial. A continuación vamos a ver como definir métodos que le den alguna funcionalidad interesante a nuestra clase de pingüino.

class Penguin:
    # Definiendo un atributo de clase
    clase = "Ave"
 
    # El método __init__ es llamado al crear el objeto
    def __init__(self, nombre, especie):
        print("Creando pingüino: " + "'" + nombre + "', " + especie)
 
        # Atributos de instancia
        self.nombre = nombre
        self.especie = especie
    
    def nada(self):
        print("Wooooshhhhh!!!!!")
 
    def camina(self, numero_pasos):
        print(f"Caminando {pasos} numero_pasos, lenta y torpemente")
 
# Creando un pingüino
mi_pinguino = Penguin("Enri", "Emperador")
 
# Viendo qué tipo de dato es mi_pinguino
print(type(mi_pinguino))
 
# Viendo qué clase de animal es
print(Penguin.clase)
print(mi_pinguino.nombre)
 
# Métodos: acciones de nuestro pinguino
mi_pinguino.nada()
mi_pinguino.camina(100)

Herencia

La herencia es un proceso mediante el cual se puede crear una clase hija que hereda de una clase padre, compartiendo sus métodos y atributos. Además de ello, una clase hija puede sobreescribir los métodos o atributos, o incluso definir unos nuevos.

Se puede crear una clase hija con tan solo pasar como parámetro la clase de la que queremos heredar. En el siguiente ejemplo vemos como se puede usar la herencia en Python, con la clase Serpiente que hereda de Animal.

class Animal:
    def __init__(self, especie, edad):
        self.especie = especie
        self.edad = edad
 
    # Método genérico pero con implementación particular
    def hablar(self):
        # Método vacío
        pass
 
    # Método genérico con la misma implementación
    def describeme(self):
        print("Soy un animal del tipo", type(self).__name__)
 
class Serpiente(Animal):
    # Definiendo un atributo de clase
    clase = "Reptil"
 
    def hablar(self):
        print("ssSsssSSSSsssS")
 
# Corroborar la herencia
print(Serpiente.__bases__)
 
# Creando nuestra serpiente
mi_serpiente = Serpiente("Pitón", 10)
 
# Verificando a nuestra serpiente
print(mi_serpiente.especie)
print(mi_serpiente.edad)
 
# Métodos: acciones de nuestra serpiente
mi_serpiente.hablar()
mi_serpiente.describeme()