1

Entendiendo la Herencia

Herencia
Una de las propiedades que mencionamos que podían tener los objetos es la herencia, por lo que una clase hija puede contener propiedades y métodos de una clase padre. Veamos un ejemplo:

# Definimos la clase padre:classClasePadre:# Decimos que se ejecute el código sin hacer nada.pass# Y aquí la clase hija:classClaseHija(ClasePadre):pass# Creamos el objeto
Objeto = ClaseHija()

Este es un ejemplo:

# Definimos la clase FamiliaclassFamilia():# Con sus propiedades que se rellenarán cuando se inicialice el objeto.def__init__(self, miembros, apellidos):
    self.miembros = miembros
    self.apellidos = apellidos

    # Cuando se cree la clase, mostrará el apellido que ha recibido.
    print("Apellidos: %s" % (self.apellidos))

# Creamos la clase Hijo que hereda de FamiliaclassHijo(Familia):# Se rellenarán propiedades para este objeto.def__init__(self, nombre, apellidos):# Si queremos heredar propiedades y métodos, tendremos que hacer uso de la función super()# super() lo explicaremos más adelante.# Aquí llamamos la propiedad específica de Familia, Familia.apellidos y la inicializamos
    super().__init__(self,apellidos)

    # Definimos aquí los valores que tendrán estas propiedades
    self.nombre = nombre
    self.apellidos = apellidos

# Añadimos un método para el Hijodefmostrar_info(self):# Decimos que imprima self.nombre y self.apellidos.
    print("Soy %s y soy de la familia %s" % (self.nombre,self.apellidos))

# Creamos el objeto
Pugsley = Hijo("Pugsley","Adams")

# Llamamos al método mostrar_info()
Pugsley.mostrar_info()

Seguro que te preguntas sobre super().init(…), esta función como comentamos permite heredar propiedades y métodos de otra clase. Vendría a ser lo mismo que:

classA:def__init__(self, ejemplo):
    self.ejemplo = ejemplo

classB(A):def__init__(self, x, y, z):# Este procedimiento es más complicado y más tedioso de hacer.
    self.guardar_info = A(x)

obj = B(2,3,4)
print(obj.guardar_info.ejemplo)

Sobreescribiendo métodos en clases hijas

Se puede hacer evidentemente, si en la clase A tenemos un método llamado saludar(), y la clase B que hereda de la clase A, le podemos definir el contenido del mensaje que devolverá el método saludar().

classA:defsaludar(self):
    print("Hola mundo")

classB(A):defsaludar(self):
    print("Hello everybody")

obj = B
obj.saludar()

Tipos de herencia

Bien, habiendo visto un ejemplo de herencia, también os cuento, que hay distintos ejemplos de herencia:

  • Simple

  • Múltiple

  • Multi nivel

  • Jerárquica

  • Híbrida

Simple

classA:passclassB(A):pass

Múltiple

Es una clase que hereda desde otras clases, por lo que tendrá propiedades y métodos de ambas clases (A y B).

classA:passclassB:passclassC(A,B):pass# Establecemos una comparación para ver si realmente son subclases o no.# Devolverá True o False dependiendo de si es correcto o no.
issubclass(C,A) and issubclass(C,B)

Multinivel

Esto se refiere, a que tenemos una clase abuelo, de la cuál hereda una clase padre, del cuál hereda una clase hijo.

classA:passclassB(A):passclassC(B):pass

Como vemos, la clase C hereda de la clase B, la clase B de la clase A, y A es la clase principial de primer nivel. Por lo tanto, la clase C herederá propiedades y métodos de todas sus clases superiores a menos que se establezca qué propiedades o métodos se podrán heredar, esto forma parte del encapsulamiento que veremos más tarde.

Jerárquica

Tenemos múltiples clases que heredan de una sola clase, es decir.

classA:passclassB(A):passclassC(A):passclassD(A):pass

Un ejemplo puede ser, clase Jefe/Jefa de una empresa que tiene el rol más alto de una organización y que por debajo de ellos hay otros roles acordes a la labor de la empresa que tienen menos privilegios, otras funciones…etc

Híbrido

Es la combinación de una o múltiples clases con una o múltiples clases por ejemplo: Imaginamos que tenemos 5 clases (A,B,C,D,E).

  • Clase A es una clase padre.

  • Clase B,C,D heredan de la clase A

  • Clase E, hereda de la clase B y D.

  • Clase E es la clase padre de B y D.

Aquí podemos identificar varios tipos de herencia:

  • A, B, C, D, C = Herencia híbrida

  • B, C, D que heredan de A = Herencia jerárquica

  • E que hereda de B y D = Herencia múltiple

  • C hereda de A = Herencia simple

Un ejemplo de sintaxis:

classA:
  pass
classB(A):
  pass
classC(A):
  pass
classD(A):
  pass
classE(B,D)

Si añadimos una variable en la clase A, creamos un objeto que referencie a E:

classA:
  hello_world = "Hola Mundo"classB(A):passclassC(A):passclassD(A):passclassE(B,D):pass
obj = E()
print(obj.hello_world)

Función super()

Se utiliza para llamar a métodos de una clase padre, hemos visto en un ejemplo anterior como llamábamos a super().init(self, nombre, apellidos) en el ejemplo de la Familia Adams. Aquí estábamos llamando al método inicializador de la clase Familia. Pero podemos llamar a otros métodos también. super().método().

`classVehiculo:defarrancar(self):
    print("Arrancamos el coche")
  defparar(self):
    print("Paramos el coche")

classConductor(Vehiculo):defsoplar(self):
    print("Soplando, soplando y soplando...")

  defcontrol_policia(self):
    super().parar()
    print("Persona - Hola agente, buenos días")
    print("Policía - Hola, vamos hacerle una prueba de alcoholemia, por favor, sople en la boquilla")
    print("Persona - Vale")
    self.soplar()
    print("Policía - Genial, puede usted proseguir")
    super().arrancar()

Antonio = Conductor()
Antonio.control_policia()

Como vemos, no hace falta que llamemos a init porque no estamos inicializando ningún valor en ninguna propiedad y como se ejecutan los métodos parar() y arrancar() que forman parte de la clase Vehiculo.

Escribe tu comentario
+ 2