Saltar a contenido

Herencia

Clases padre e hija

Una clase se puede copiar de otra:

Clases5.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Ave:

    def __init__(self, nombre):
        self.nombre = nombre

    def volar(self):
        print (self.nombre, "está volando")

class Loro (Ave):

    def saludar(self):
        print (self.nombre, "dice hola")

    def despedirse(self):
        print (self.nombre, "dice adios")

Poly = Loro("Poly")
print("Creando", Poly.nombre)
print("\nContenido de Poly:")
lista = dir(Poly)
for elemento in lista:
    if elemento[0] == '_':
        pass
    else:
        print("- "+elemento)

print()
Poly.volar()
Poly.saludar()
Poly.despedirse()

print()
print(Poly.nombre, "es suprimido")
del Poly

Lo que muestra:

Creando Poly

Contenido de Poly:
- despedirse
- nombre
- saludar
- volar

Poly está volando
Poly dice hola
Poly dice adios

Poly es suprimido

En este ejemplo:

  • creamos una clase Ave con un método volar() y una propiedad nombre.

  • creamos una clase Loro derivada de Ave

    class Loro (Ave):
        método añadidos por la clase Loro
    
  • todos los loros son aves, y la clase Loro hereda las características de la clase Ave, añadiendo las suyas propias.

  • A la clase original se le llama clase padre

  • La clase derivada se llama clase hija

Si la clase hija define un método con el mismo nombre que otro de la clase padre, lo sustituye:

Clases6.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Ave:

    def __init__(self, nombre):
        self.nombre = nombre

    def volar(self):
        print (self.nombre, "está volando")

class Loro (Ave):

    # método redefinido
    def __init__(self, nombre):
        self.nombre = "Loro "+nombre

    def saludar(self):
        print (self.nombre, "dice hola")

    def despedirse(self):
        print (self.nombre, "dice adios")

Poly = Loro("Poly")
Piolin = Ave("Piolin")

Poly.volar()
Piolin.volar()

Muestra:

Loro Poly está volando
Piolin está volando

Hemos redefinido el método __init__() de la clase Loro para que el nombre de los objetos de esta clase incluya el nombre de la misma.

Llamada a métodos de la clase padre

Si reescribimos un método en la clase hija, a veces es necesario dejar las sentencias comunes en la clase padre y añadir en la hija las sentencias especializadas. En este caso, hay que acordarse de invocar desde la clase hija el método original:

Clases6.py
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Ave:

    def __init__(self, nombre):
        self.nombre = nombre

    def volar(self):
        print (self.nombre, "está volando")

class Loro (Ave):

    # método redefinido
    def __init__(self, nombre):
        super().__init__(nombre)
        self.nombre = "Loro "+self.nombre

    def saludar(self):
        print (self.nombre, "dice hola")

    def despedirse(self):
        print (self.nombre, "dice adios")

Poly = Loro("Poly")
Piolin = Ave("Piolin")

Poly.volar()
Piolin.volar()

Muestra:

Loro Poly está volando
Piolin está volando

En el método de la clase padre definimos la propiedad nombre. El método de la clase hija llama al de la clase padre y, una vez creada la propiedad, le añade el prefijo "Loro".

La llamada a la clase padre se hace creando una instancia anónima:

super().__init__(nombre)

La palabra super hace referencia a la clase padre.