Documente Academic
Documente Profesional
Documente Cultură
Herencia en la POO
Presentación
En esta unidad veremos en qué consiste la herencia y cómo aprovecharla para
ahorrarnos muchísimas líneas de código.
Herencia
La herencia es la capacidad que tiene una clase de heredar los atributos y
métodos de otra, algo que nos permite reutilizar código y hacer programar
mucho más óptimos.
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 1/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Todos los productos de la tienda tenían una serie de atributos comunes, como la
referencia, el nombre, el pvp... pero algunos eran especí cos de cada tipo.
Si partimos de una clase que contenga todos los atributos, quedaría más o
menos así:
Código Resultado
class Producto:
def __init__(self, referencia, tipo, nombre,
pvp, descripcion, productor=None,
distribuidor=None, isbn=None, autor=None):
self.referencia = referencia
self.tipo = tipo
self.nombre = nombre
self.pvp = pvp
self.descripcion = descripcion
self.productor = productor
self.distribuidor = distribuidor
self.isbn = isbn
self.autor = autor
print(adorno)
print(adorno.tipo)
Superclases
Así pues la idea de la herencia es identi car una clase base (la superclase) con
los atriutos comunes y luego crear las demás clases heredando de ella (las
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 2/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
subclases) extendiendo sus campos especí cos. En nuestro caso esa clase
sería el Producto en sí mismo:
class Producto:
def __init__(self,referencia,nombre,pvp,descripcion):
self.referencia = referencia
self.nombre = nombre
self.pvp = pvp
self.descripcion = descripcion
def __str__(self):
return f"REFERENCIA\t {self.referencia}\n" \
f"NOMBRE\t\t {self.nombre}\n" \
f"PVP\t\t {self.pvp}\n" \
f"DESCRIPCIÓN\t {self.descripcion}\n"
Subclases
Para heredar los atributos y métodos de una clase en otra sólo tenemos que
pasarla entre paréntesis durante la de nición:
Código Resultado
class Adorno(Producto):
pass
class Alimento(Producto):
productor = ""
distribuidor = ""
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 3/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
def __str__(self):
return f"REFERENCIA\t {self.referencia}\n" \
f"NOMBRE\t\t {self.nombre}\n" \
f"PVP\t\t {self.pvp}\n" \
f"DESCRIPCIÓN\t {self.descripcion}\n" \
f"PRODUCTOR\t\t {self.productor}\n" \
f"DISTRIBUIDOR\t\t {self.distribuidor}\n"
class Libro(Producto):
isbn = ""
autor = ""
def __str__(self):
return f"REFERENCIA\t {self.referencia}\n" \
f"NOMBRE\t\t {self.nombre}\n" \
f"PVP\t\t {self.pvp}\n" \
f"DESCRIPCIÓN\t {self.descripcion}\n" \
f"ISBN\t\t {self.isbn}\n" \
f"AUTOR\t\t {self.autor}\n"
Código Resultado
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 4/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Trabajando en conjunto
Gracias a la exibilidad de Python podemos manejar objetos de distintas clases
masivamente de una forma muy simple.
Vamos a empezar creando una lista con nuestros tres productos de subclases
distintas:
Código Resultado
print(productos)
Código Resultado
También podemos acceder a los atributos, siempre que sean compartidos entre
todos los objetos:
Código Resultado
Código Resultado
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 5/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Por suerte podemos hacer una comprobación con la función isinstance() para
determinar si una instancia es de una determinado clase y así mostrar unos
atributos u otros:
Código Resultado
Polimor smo
El polimor smo es una propiedad de la herencia por la que objetos de distintas
subclases pueden responder a una misma acción.
Código Resultado
print(alimento, "\n")
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 6/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
rebajar_producto(alimento, 10)
print(alimento)
Por cierto, como podéis ver en el ejemplo, cuando modi camos un atributo de
un objeto dentro de una función éste cambia en la instancia. Esto es por aquello
que os comenté del paso por valor y referencia.
Copia de objetos
De la misma forma que las colecciones, los objetos se pasan a las funciones por
referencia. Si modi camos sus valores dentro, éstos se verán re ejados fuera.
Código Resultado
class Test:
pass
test1 = Test()
test2 = test1
test1.algo = "Prueba"
try:
print(test2.algo)
except Exception as e:
print(e)
Para realizar una copia a partir de sus valores podemos utilizar la función copy
del módulo con el mismo nombre:
Código Resultado
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 7/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
class Test:
pass
test1 = Test()
test2 = copy(test1)
test1.algo = "Prueba"
try:
print(test2.algo)
except Exception as e:
print(e)
Código Resultado
lista1 = [1,2,3]
lista2 = copy(lista1)
lista1 = None
print(lista1)
print(lista2)
Herencia múltiple
Finalmente hablemos de la herencia múltiples, la capacidad de que una subclase
de heredar de múltiples superclases.
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 8/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Código Resultado
class A:
def __init__(self):
print("Soy de clase A")
def a(self):
print("Este método lo heredo de A")
class B:
def __init__(self):
print("Soy de clase B")
def b(self):
print("Este método lo heredo de B")
class C(B,A):
def c(self):
print("Este método es de C")
c = C()
c.a()
c.b()
c.c()
Ejercicio optativo
Teoría previa
Hasta ahora sabemos que una clase heredada puede fácilmente extender
algunas funcionalidades, simplemente añadiendo nuevos atributos y métodos, o
sobreescribiendo los ya existentes. Como en el siguiente ejemplo:
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 9/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Ejercicio Resultado
class Vehiculo():
def __str__(self):
return "Color {}, {} ruedas".format( self.color,
self.ruedas )
class Coche(Vehiculo):
def __str__(self):
return "color {}, {} km/h, {} ruedas, {} cc".format(
self.color, self.velocidad, self.ruedas, self.cilindrada )
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 10/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Ejercicio Resultado
class Vehiculo():
def __str__(self):
return "Color {}, {} ruedas".format( self.color,
self.ruedas )
class Coche(Vehiculo):
def __str__(self):
return Vehiculo.__str__(self) + ", {} km/h, {}
cc".format(self.velocidad, self.cilindrada)
Hacerlo de esta forma además nos permite llamar cómodamente los métodos o
atributos de la superclase sin necesidad de especi car el self, pero ojo, sólo se
aconseja utilizarlo cuando tenemos una única superclase:
Ejercicio Resultado
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 11/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
class Vehiculo():
def __str__(self):
return "color {}, {} ruedas".format( self.color,
self.ruedas )
class Coche(Vehiculo):
def __str__(self):
return Vehiculo.__str__(self) + ", {} km/h, {}
cc".format(self.velocidad, self.cilindrada)
Enunciado
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 12/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
Realiza una función llamada catalogar() que reciba la lista de vehiculos y los
recorra mostrando el nombre de su clase y sus atributos.
Recordatorio
Puedes utilizar el atributo especial de clase name para recuperar el nombre de la clase de un
objeto:
type(objeto).__name__
Solución
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 13/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
class Vehiculo():
def __str__(self):
return "color {}, {} ruedas".format( self.color,
self.ruedas )
class Coche(Vehiculo):
def __str__(self):
return super().__str__() + ", {} km/h, {} cc".format(
self.velocidad, self.cilindrada)
class Camioneta():
pass
class Bicicleta():
pass
class Motocicleta():
pass
def catalogar():
pass
def catalogar():
pass
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 14/15
2/10/2018 Herencia en la POO | Curso de Python | Hektor Profe
https://www.hektorprofe.net/python/herencia-en-la-poo/#herencia 15/15