Está en la página 1de 56

Programación I

Parte II
Herencia
Jhonny Felípez Andrade
Contenido
 Herencia
 Ejemplos
 Polimorfismo
 Ejemplo
 Polimorfismo en tiempo de ejecución
 Ejemplos
 Herencia Múltiple
 Ejemplos
 Clase Abstracta
 Ejemplo
HERENCIA
¿Qué es la herencia?

4
La herencia es un principio de la
Programación Orientada a Objetos que
permite que una clase adquiera
propiedades y comportamientos de otra
clase padre. La clase hija hereda todos
los atributos y métodos de la clase
padre, lo que puede ahorrar tiempo y
esfuerzo en la implementación de
nuevas clases.
5
Herencia

CLASE

SUBCLASE

Una subclase es una clase que esta basada en otra clase. Esta
hereda los atributos de la clase. Esta también puede incluir
nuevos atributos.
Herencia

class Cliente:
nombre = ""
numero_cuenta = 0

class Cliente_Preferido:
nombre = ""
numero_cuenta = 0
tipo_de_cuenta = ""
Herencia

Clase

Subclase Subclase

Subclase Subclase Subclase Subclase

A través de la herencia, se puede hacer un cambio en una clase padre, y se


puede aplicar a todas las subclases. Por otra parte, los atributos se pueden
transmitir a través de múltiples generaciones.
Herencia
(generalización/especialización)

 La herencia permite definir nuevas clases en


función de otras clases ya existentes.
 La clase “derivada” o la subclase hereda los
métodos y atributos de la clase base.
 Esto permite, redefinir el comportamiento de los
métodos heredados y/o extender su funcionalidad
mediante otros nuevos métodos.
 Es la característica clave de los sistemas
orientados a objeto para propiciar la reusabilidad.
EJEMPLOS
Ejemplo de Herencia

Persona
es-una es-una

Empleado Cliente

Dado un conjunto de clases, hay que buscar atributos y métodos


comunes a esas clases y elevar a una clase más general.
Ejemplo de Herencia

Figura
es-una es-una

Circulo Triangulo
Ejercicios

 Proponer tres ejemplos de herencia.


Ejemplo de Herencia

Vehículo
es-un es-un

Coche Avión
class Vehiculo:
def __init__(self, s=None): # Constructor
print("Constructor de Vehículo...",s)
def iniciar(self):
print("Arranca...") La clase Coche “hereda” de la
class Coche(Vehiculo): clase Vehiculo
def __init__(self, s=None): # Constructor
super().__init__(s)
print("Constructor de Coche...", s)
def conducir(self):
print("Conduce...")
c1 = Coche()
c1.iniciar()
Llama a un método de la
c1.conducir()
superclase
c2 = Coche("dos")
c2.iniciar()
c2.conducir()

La palabra reservada super() hace referencia a la


superclase y puede ser utilizada para llamar a los
métodos constructores y métodos de la
15
superclase.
Ejemplo de Salida

Constructor de Vehículo...
Constructor de Coche...
Arranca...
Conduce...
Constructor de Vehículo... dos
Constructor de Coche... dos
Arranca...
Conduce...

16
POLIMORFISMO

17
Si se tiene diferentes objetos y se tiene
que realizar las mismas acciones con
estos objetos.

¿Será necesario reescribir el código


para cada objeto?
Polimorfismo

 El polimorfismo es un concepto que permite a un


método operar de maneras distintas en diferentes tipos
de objetos.
 Proporciona una abstracción útil que permite a los
usuarios a tratar objetos diferentes de una manera
similar.
 Ejemplo: lanzar, puede ser implementado tanto para el
objeto Tenis así como para el objeto Basquet o
Fútbol.
 Ejemplo: area, puede ser implementado tanto para un
objeto Cuadrado y Rectángulo.

19
Polimorfismo

método

2, 3 5

objetos distintos 3.0, 4.0 suma() 7.0

1/2, 1/4 3/4

trata a distintos objetos de manera similar

20
EJEMPLO
Ejemplo de Herencia

Figura
es-un es-un

Circulo Cuadrado
import math
class Figura:
def area(self): La clase Circulo tiene 3 métodos:
pass __init__, area y perimetro
def perimetro(self):
pass
class Circulo(Figura):
Se sobrescribe o sobrecarga
def __init__(self, radio):
self.radio = radio el método area
def area(self):
return math.pi * self.radio ** 2
def perimetro(self):
return 2 * math.pi * self.radio
class Cuadrado(Figura):
def __init__(self, lado):
self.lado = lado
def area(self):
return self.lado ** 2 Se sobrescribe o sobrecarga
def perimetro(self): el método perimetro
return 4 * self.lado

23
Ejemplo de Salida
circulo = Circulo(5)
cuadrado = Cuadrado(6)

print(circulo.area())
print(cuadrado.area())

78.53981633974483
36

24
Se tiene dos subclases que heredan de la
clase "Figura" y definen su propia
implementación de los métodos "area" y
"perimetro", pero utilizando la misma interfaz
que la clase base. Esto significa que todas las
subclases pueden ser tratadas como objetos
de la clase "Figura", lo que nos permite utilizar
el polimorfismo.
Se puede crear diferentes objetos de las dos
subclases y llamar a sus métodos "area" y
"perimetro" de la misma manera, aunque su
implementación es diferente.
25
POLIMORFISMO EN TIEMPO
DE EJECUCIÓN
26
Polimorfismo

Polimorfismo significa que una variable de


un supertipo puede hacer referencia a un
objeto de un subtipo.
EJEMPLOS
import math
class Figura:
color = ""
def __init__(self, c):
self.color = c
def getColor(self):
return self.color
def __str__(self):
return "Figura [color={}]".format(self.color)
class Circulo (Figura):
radio = 0.0
def __init__(self, radio, color):
super().__init__(color)
self.radio = radio
def getArea(self):
return math.pi * self.radio * self.radio
def __str__(self):
return "Circulo [radio= {}]".format(self.radio)

29
class Rectangulo (Figura):
base = 0.0
altura = 0.0
def __init__(self, base, altura, color):
super().__init__(color)
self.base = base
self.altura = altura
def getArea(self):
return self.base * self.altura

30
def despliegaObjeto(f):
print(f.__str__())

circulo = Circulo(2, "Rojo")


rectangulo = Rectangulo(2,3,"Azul")
despliegaObjeto(circulo) Llamadas
despliegaObjeto(rectangulo) polimórficas.

Polimorfismo: La variable f puede hacer referencia a un objeto de


Figura o a un objeto de alguna clase hija de Figura (puede tomar
muchas formas o muchas referencias).

Enlace Dinámico: El método __str__ está implementado en más de


una clase, en tiempo de ejecución se decidirá a cual de ellos llamar.

31
Ejemplo de Salida

Circulo [radio= 2]
Figura [color=Azul]

32
import math
class Figura:
color = ""
def __init__(self, c):
self.color = c
def getColor(self):
return self.color
def __str__(self):
return "Figura [color={}]".format(self.color)
class Circulo (Figura):
radio = 0.0
def __init__(self, radio, color):
super().__init__(color)
self.radio = radio
def getArea(self):
return math.pi * self.radio * self.radio
def __str__(self):
return "Circulo [radio= {}]".format(self.radio)

33
class Rectangulo (Figura):
base = 0.0
altura = 0.0
def __init__(self, base, altura, color):
super().__init__(color)
self.base = base
self.altura = altura
def getArea(self):
return self.base * self.altura

34
figuras = [0] * 2
figuras[0] = Circulo(2, "Rojo")
figuras[1] = Rectangulo(2, 3, "Azul")

for i in range(len(figuras)):
print(figuras[i].__str__())

for: es utilizado para 2 diferentes objetos:

Se observa un código polimórfico porque figuras[i] hace


referencia a distintos objetos, de acuerdo al índice del arreglo.

35
Ejemplo de Salida

Circulo [radio= 2]
Figura [color=Azul]

36
HERENCIA MÚLTIPLE
¿Qué es la herencia múltiple?

38
La herencia múltiple en programación
orientada a objetos se refiere a la
capacidad de una clase de heredar
atributos y métodos de múltiples clases
padre. Esto permite a una clase
derivada heredar y combinar
características de varias clases
diferentes.

39
¿Cómo heredar una clase a
partir de dos clases?

40
EJEMPLOS
Ejemplo de Herencia
Múltiple

Empleado
es-un es-un

Vendedor Gerente
es-un
es-un
Gerente
de ventas
Ejemplo de Herencia
Múltiple

Empleado
es-un es-un

Ingeniero Secretario

es-un
es-un
Secretario
Técnico
Ejemplo de Herencia
Múltiple

Persona
es-una es-una

Profesor Autor
es-un
es-un
Profesor
Autor
Ejemplo de Herencia
Múltiple

Persona
es-una es-una

Empleado Estudiante

es-un
es-un
Estudiante
Trabajador
class Persona:
def __init__(self, nombre):
self.nombre = nombre La clase Empleador “hereda” de
class Empleador(Persona): la clase Persona
def __init__(self, nombre, salario):
Persona.__init__(self, nombre) Utiliza el atributo de la
self.salario = salario superclase
def __str__(self):
return self.nombre + " Salario: " + str(self.salario)
class Estudiante(Persona):
def __init__(self, identificacion, nota):
self.identificacion = identificacion
self.nota = nota
def __str__(self):
return " Id: " + str(self.identificacion) + " Nota: " + str(self.nota)
class EstudianteTrabajador(Empleador, Estudiante):
def __init__(self, nombre, identificacion, nota, salario):
Empleador.__init__(self, nombre, salario)
Estudiante.__init__(self, identificacion, nota)
def __str__(self):
return Empleador.__str__(self) + " " + Estudiante.__str__(self)
et = EstudianteTrabajador("Juan",55555,100, 2000)
print(et)
46
Ejemplo de Salida

Juan Salario: 2000 Id: 55555 Nota: 100

47
CLASE ABSTRACTA
¿Cómo obligar a una subclase para que
sobre escriba todos los métodos
definidos en una superclase?
Clases Abstractas

Una clase abstracta no se puede utilizar


para crear objetos. Una clase abstracta
podría contener métodos abstractos, los
cuales deberán ser implementados en
las subclases.
EJEMPLO
import math
from abc import ABC, abstractmethod
class Figura (ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimetro(self):
pass
class Circulo(Figura):
def __init__(self, radio):
self.radio = radio
def area(self):
return math.pi * self.radio ** 2
def perimetro(self):
return 2.0 * math.pi * radio
class Rectangulo(Figura):
def __init__(self, ancho, alto):
self.ancho = ancho
self.alto = alto
def area(self):
return self.ancho * self.alto
def perimetro(self):
52
return 2 * (self.ancho + self.alto)
c = Circulo(5)
print("Area = ", c.area())
r = Rectangulo(2,3)
print("Area = ", r.area())

53
Ejemplo de Salida

Area = 78.53981633974483
Area = 6

54
Bibliografía

 https://docs.python.org/3/tutorial/class
es.html?highlight=classes
 https://docs.python.org/es/dev/library/
abc.html

55
GRACIAS

También podría gustarte