Python - Lección 17: Programación orientada a objetos, herencia y polimorfismo

Programación orientada a objetos, herencia y polimorfismo:

La programación orientada a objetos es un paradigma en la programación. Esto quiere decir que es una teoría que nos dará la base para resolver problemas, de esta forma, podemos pensar en los problemas complejos como “objetos”.
Este paradigma utiliza los conceptos de objetos y clases, en donde los objetos son una colección única de atributos que poseen (datos)y las acciones que realizan (métodos) y la “clase” puede considerarse el “plano técnico” de los objetos.

  • Veamos como definimos un objeto en Python:
# Definimos la clase
class Personaje():

    # Definimos la clase
    def __init__(self,raza,nivel,fuerza,destreza,inteligencia):
        # Definimos los atributos
        self.raza = raza
        self.nivel = nivel
        self.fuerza = fuerza
        self.destreza = destreza
        self.inteligencia = inteligencia

# Instanciamos dicha clase y le asignamos valores a sus atributos
Humano = Personaje(raza='Humano',nivel=84,fuerza=82,destreza=59,inteligencia=30)

# Imprimimos la clase cargada.
print (f"Raza del personaje: {Humano.raza}\nNivel: {Humano.nivel}\nEstadística de inteligencia: {Humano.inteligencia}")

Herencia:

Los conceptos que veremos no son propios del lenguaje Python sino de todos los lenguajes de programación en general, como así también lo es la herencia.
Una de las facilidades que nos trae el paradigma, es la posibilidad de crear clases “hijas” con una copia de los atributos de su clase “padre”, pudiendo sobrescribir algunos atributos o incluso añadiendo nuevos.

  • Veamos cómo se consigue esto:
class Persona:
    def __init__(self, primer_nombre, apellido):
        self.nombre = primer_nombre
        self.apellido = apellido

    def imprimirNombre(self):
        print(self.primer_nombre, self.apellido)


x = Persona("Leia", "Organa")
x.imprimirNombre()

class Estudiante(Persona):
    pass

y = Estudiante("Luke", "Skywalker")
y.imprimirNombre() 

En caso de no añadir ningún atributo o método, usaremos la palabra clave “pass”.

  • Cuando necesitemos que la clase cree un nuevo objeto, usaremos la función init(). Todas las clases cuentan con esta función que siempre se ejecuta cuando la clase es inicializada, que asigna valores a las propiedades de los objetos u otras operaciones que son necesarias inicializar cuando el objeto es creado. Cuando usamos esta función, la clase hija ya no heredará la función init() de la clase padre.
    Un ejemplo de esto:
class Persona:
  def __init__(self, nombre, edad):
    self.nombre = nombre
    self.edad = edad

p1 = Persona("Javier", 34)

print(p1.nombre)
print(p1.edad)
  • En caso de necesitar que al mismo tiempo se herede todas las clases y métodos de la clase padre, utilizaremos la función super(). Al mismo tiempo, vamos a añadir un nuevo atributo a nuestra clase “hija”, y al final, añadiremos una clase:
class miembroDelForo(Persona):
    def __init__(self, nombre, apellido):
        super().__init__(nombre, apellido) 
        self.titulo = titulo

    def presentacion(self):
        print(f"Mi nombre es {self.nombre} {self.apellido} y soy {self.titulo}")

x = miembroDelForo("Javier", "Cabral", "Analista en Sistemas")

El parámetro self es una referencia a la presente instancia de la clase y se utiliza para acceder a las variables que corresponden a la misma. No necesariamente se tiene que llamar self, pero tiene que ser el primer parámetro de cualquier función en la clase.

Polimorfismo:

El polimorfismo hace referencia a los múltiples métodos, funciones u operadores del mismo nombre, que pueden ser ejecutados a través de múltiples objetos o clases. Por ejemplo, contamos con la función “len()” que puede ser utilizada en diferentes objetos como listas, tuplas y diccionarios.
En una clase, el polimorfismo se utiliza cuando tenemos múltiples clases con métodos del mismo nombre entre ellas:

class Automovil:
  def __init__(self, marca, modelo):
    self.marca = marca
    self.modelo = modelo

  def se_traslada(self):
    print("¡Corre!")

class Bote:
  def __init__(self, marca, modelo):
    self.marca = marca
    self.modelo = modelo

  def se_traslada(self):
    print("¡Navega!")

class Avion:
  def __init__(self, marca, modelo):
    self.marca = marca
    self.modelo = modelo

  def se_traslada(self):
    print("¡Vuela!")

auto1 = Automovil("Ford", "Mustang")
bote1 = Bote("Ibiza", "Touring 20")
avion1 = Avion("Boeing", "747")

for x in (auto1, bote1, avion1):
  x.se_traslada()

Bueno, este tema ha sido más largo de lo que veníamos acostumbrados y es un ejemplo de lo que se viene más adelante. Las cosas ahora sí se ponen interesantes.

<Tema anterior - Tema siguiente>

1 me gusta