Objetos en Python
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()