Herencias en Python 3

1. Herencias

Por ejemplo, una aplicación donde se gestionan los productos:

Productos:

  • Adornos
  • Alimentos
  • Libros

Todos los productos tienen: Referencia, Nombre, Precio y Descripción

Pero además los alimentos tienen: Productor y Distribuidor y los libros tienen: ISBN y Autor.

Primero identificar la superclase -> Producto y subclases tenemos -> adorno, alimento y libro

class Producto:

def __init__(self,referencia,nombre,pvp,descripcion):

self.referencia = referencia

self.nombre = nombre

self.pvp = pvp

def __str__(self):

return “””\

REFERENCIA\t{}

NOMBRE\t\t{}

PVP\t\t{}

DESCRIPCIÓN\t{}”””.format(self.referencia,self.nombre,self.pvp,self.descripcion)

# La class Adorno no tiene código ya que hereda los campos de Producto

class Adorno(Producto):

pass

ad = Adorno(2034,”Vaso adornado”,15,”Vaso de porcelana”)

# Class Para Alimento heredando Producto pero necesita 2 campos nuevos: productor y distribuidor

class Alimento(Producto):

productor = “”

distribuidor = “”

def __str__(self):

return “””\

REFERENCIA\t{}

NOMBRE\t\t{}

PVP\t\t{}

DESCRIPCIÓN\t{}

PRODUCTOR\t{}

DISTRIBUIDOR\t{}”””.format(self.referencia,self.nombre,self.pvp,self.descripcion,self.productor,self.distribuidor)

al = Alimento(2035,”Botella de Aceite de Oliva Extra”,5,”250 ML”)

al.productor = “La Aceitera”

al.distribuidor = “Distribuciones SA”

# Class para libro heredando de Producto, pero añadiendo los campos: isbn y autor

class Libro(Producto):

isbn = ” “

autor = ” “

def __str__(self):

return “””\

REFERENCIA\t{}

NOMBRE\t\t{}

PVP\t\t{}

DESCRIPCION\t{}

ISBN\t\t{}

AUTOR\t\t{}”””.format(self.referencia,self.nombre,self.pvp,self.descripcion,self.isbn,self.autor)

li = Libro(2036,”Cocina Mediterránea”,9,”Recetas sanas y buenas”)

li.isbn = “0-123456-78-9”

li.autor = “Doña Juana”

De que manera puedo yo mostrar la información de dichos productos, cuando cada clase tiene campos diferentes entre ellos:

for p in productos:

if( isinstance(p, Adorno) ):

print(p.referencia,p.nombre)

elif( isinstance(p, Alimento) )

print(p.referencia,p.nombre,p.productor)

elif( isinstance(p, Libro) ):

print(p.referencia,p.nombre,p.isbn)

2034   Vaso adornado

2035   Botella de Aceite de Oliva Extra La Aceitera

2036 Cocina Mediterránea 0-123456-78-9

E incluso podemos crear una función para modificar la información de los productos:

def rebajar_producto(p, rebaja):

“””Devuelve un producto con una rebaja en porcentaje de su precio”””

p.pvp = p.pvp – (p.pvp/100 * rebaja)

return p

al_rebajado = rebajar_producto(al, 10)

print(al_rebajado)

REFERENCIA      2035

NOMBRE              Botella de Aceite de Oliva Extra

PVP                         4.5

DESCRIPCION     250 ML

PRODUCTOR       La Aceitera

DISTRIBUIDOR  Distribuciones SA

 

Nota: los objetos también se cambien directamente ya que se referencian como las listas o diccionarios. Así que no podríamos hacer una copia del objeto

copia_al = al

copia_al.referencia = 2038

print(copia_al)

REFERENCIA      2038

NOMBRE              Botella de Aceite de Oliva Extra

PVP                         4.5

DESCRIPCION     250 ML

PRODUCTOR       La Aceitera

DISTRIBUIDOR  Distribuciones SA

Pero podemos hacer copias con el método copy de la libreria de python:

import copy

copia_ad = copy.copy(ad)

2. Herencia múltiple

Hace referencia a la posibilidad de que una subclase herede de varias superclases a la vez. Dando prioridad a las superclases de la izquierda.

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()

Soy de clase B

c.a()

Este método lo heredo de A

c.b()

Este método lo heredo de B

c.c()

Este método es de C

Las herencias no suelen usarse demasiado, pero si es verdad que esta jerarquía la implementan algunos frameworks en la actualidad.

Autor entrada: CharlieJ

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *