Python 馃悕 : POO - Herencia
En art铆culos anteriores mencionaba de una forma breve el concepto de herencia. Aqu铆 vamos a ver no solo c贸digo sino que tambi茅n su representaci贸n en los diagramas de clases. En este tipo de relaciones permiten que una clase (hija o subclase) reciba atributos y m茅todos de otra clase (padre o superclase). Estos atributos y m茅todos recibidos se suman a los que la clase tiene po si misma.
Un ejemplo de esto en un diagrama de clases podr铆a ser la siguiente: profesor, padre, estudiante son personas:
---
title: "Ejemplo de herencia"
---
classDiagram
class `Clase Persona fa:fa-person`{
+nombre
+apellido
+respirar()
}
class `Clase Profesor fa:fa-chalkboard-user`{
+calificar_examen()
}
class `Clase Estudiante fa:fa-user-graduate` {
+rendir_examen()
}
class `Clase Padre fa:fa-user-tie`{
+asistir_estudiante()
}
`Clase Persona fa:fa-person` <|-- `Clase Profesor fa:fa-chalkboard-user` : hereda
`Clase Persona fa:fa-person` <|-- `Clase Estudiante fa:fa-user-graduate` : hereda
`Clase Persona fa:fa-person` <|-- `Clase Padre fa:fa-user-tie` : hereda
En este ejemplo, las tres clases (Profesor, Padre, Estudiante) podr谩n utilizar el m茅todo respirar, ya que lo heredan de la clase persona, pero solamente la clase Profesor podr谩 calificar ex谩menes, la clase Estudiante podr谩 rendir ex谩mentes y la clase Padre podr谩 asistir a reuniones del estudiante.
Si queremos llevar el ejemplo a c贸digo, tendr铆amos que comenzar definiendo la clase Persona y luego el resto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Persona:
def __init__(self, nombre, apellido):
self.nombre = nombre
self.apellido = apellido
def respirar(self):
print("respirando")
class Profesor(Persona):
pass
class Estudiante(Persona):
pass
class Padre(Persona):
pass
Hasta aqu铆 podemos ver como efectivamente las clases (Profesor, Estudiante, Padre) son subclases de Persona:
1 2 3
print(Profesor.__bases__) print(Estudiante.__bases__) print(Padre.__bases__)
1 2 3
(<class '__main__.Persona'>,) (<class '__main__.Persona'>,) (<class '__main__.Persona'>,)
Y de forma an谩loga podemos ver que clases descienden de una en concreto:
1
print(Persona.__subclasses__())
1
[<class '__main__.Profesor'>, <class '__main__.Estudiante'>, <class '__main__.Padre'>]
Dado que una clase hija o subclase hereda los atributos y m茅todos de la clase padre, nos resulta 煤til cuando tengamos clases que se parecen entre s铆. En este caso en vez de definir varias clases de diferentes entidades, podemos tomar los elementos comunes y crear una clase superior de la que puedan heredar y de esta forma estamos respetando la filosof铆a DRY.
Uso de la funci贸n super()
La funci贸n super()
es una funci贸n incorporada (Built-in Functions) en Python que se utiliza precisamente para llamar a un m茅todo de la clase padre desde una clase hija.
En otras palabras, super()
nos permite acceder a los m茅todos y atributos de la superclase en la subclase.
Siguiendo con el ejemplo anterior, podemos usar super()
para llamar al m茅todo __init__
de la clase padre que ya acepta como par谩metros nombre y apellido, y s贸lo asignar un nuevo atributo a trav茅s de un nuevo par谩metro que sea la asignatura:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
class Profesor(Persona): def __init__(self, nombre, apellido, asignatura): super().__init__(nombre, apellido) self.asignatura = asignatura class Estudiante(Persona): pass class Padre(Persona): pass o_profesor = Profesor('Marco', 'Contreras', 'historia') print(o_profesor.respirar()) # respirando print(o_profesor.nombre) # Marco print(o_profesor.apellido) # Contretras print(o_profesor.asignatura) # 33
1 2 3 4 5 6 7 8
class Persona: def __init__(self, nombre, apellido): self.nombre = nombre self.apellido = apellido def respirar(self): print("respirando")
Benificios de la Herencia en Python
La herencia ofrece varias ventajas en la programaci贸n:
- Reutilizaci贸n de c贸digo: Permite reutilizar m茅todos y atributos comunes, evitando la duplicaci贸n de c贸digo.
- Organizaci贸n jerarquica: Facilita la creaci贸n de jerarqu铆as l贸gicas, lo que ayuda a organizar mejor el c贸digo.
- Extensibilidad: Puedes agregar nuevas funcionalidades sin modificar el c贸digo existente, simplemente creando nuevas subclases.