Tutorial 7, Herencia.

Hola de nuevo a tod@s, aquí estoy otra vez con tod@s vosotr@s, hoy, voy a explicar un concepto relacionado con la poo (programación orientada a objetos), ya expliqué en el anterior tutorial, como se crea una clase y un objeto, aquí os voy a explicar como una clase puede "heredar" de otra, por lo que si no os leísteis el tutorial anterior, os ruego que lo leáis.

Bueno, os estaréis preguntando ¿Qué es eso de herencia?, no es que una clase cuando muera le deje dinero a otra clase, eso es en la vida real, aquí cuando una clase hereda de otra, la clase heredada obtiene todos los métodos de la clase padre, y a la clase "hijo" vamos a llamarlo así, se le pueden añadir unos cuantos métodos mas aparte de los ya heredados de la clase padre, veamos un ejemplo:

class animal():
        def __init__(self):
                print "el animal ha nacido"
        def comer(self):
                print "el animal esta comiendo"
         def reproducir(self):
                print " el animal se esta reproduciendo"
         def morir(self):
                print "el animal ha muerto"

Esto tan sólo es una clase llamada animal con todas las acciones que hacen todos los seres vivos: nacer, comer, reproducirse y morir (esto es de primaria), bien, pero...¿Y si yo quiero crear una clase tiburón que aparte de todo eso nade y caze (peces)? Pues si no fuera por la herencia, tendrías que crear una clase llamada tiburón repetir todos los métodos de animal y además añadir los nuevos, pero existe la herencia para facilitarnos la vida:

class tiburon(animal):
           
           def nadar(self):
                 print "el tiburon esta nadando"
           def cazar(self):
                  print "el tiburon esta cazando"

Ya esta, así de simple, se especifica entre paréntesis la clase de la que se hereda cuando se crea la clase tiburón y ya esta, no hace falta ni especificar un constructor ya que también lo hereda, pero en casos un poco  mas complejos se puede también crear un constructor distinto, voy a poner otro ejemplo de herencia, pero este ya mas complejo:

class servivo:
       def __init__(self, size):
               self.size=size
               print "el ser vivo a nacido con un tamaño de " + str(size)
       def comer(self, comida):
               print "el animal esta comiento", comida
       def __del__(self):
               print "el animal ha muerto"

class  pez(servivo):
           def __init__(self, size, speed):
                  servivo.__init__(self, size)
                  self.speed=speed
           def nadar(self):
                  print "el pez esta nadando a una velocidad de ",  self.speed

               #al igual que la función int() transforma algo en entero, str() lo         #transforma en string (cadena de texto)

pez1=pez(58, 10)
pez1.comer("algas")
pez1.nadar()
del(pez1)

El método especial __del__ se ejecuta cuando el objeto es destruido con la función del() que esta en la última línea del código, y bueno, yo creo que ha quedado bastante claro como se crea la herencia con su propio constructor, lo único raro es "servivo.__init__(self, size)", esta línea llama al constructor de la clase ser vivo para obtener de el todos sus atributos, de esa forma tenemos tanto los atributos de ser vivo como los de pez.

En python también existe la herencia múltiple, una clase puede heredar de varias, la única diferencia es que, en vez de especificar entre paréntesis una clase padre, se especifican varias separado por comas:

class mi_clase(padre1, padre2):

Sería así, en vez de especificar tan sólo uno se hace con dos y ya esta, así de simple, para los que programaron en java, la herencia sería como un "Extends" y la herencia múltiple un "implements".

Bueno chic@s, hasta aquí ha llegado el tutorial de hoy, espero que os haya gustado, mañana daré unos cuantos matices que faltan de la Poo, pero con lo que lleváis de Poo vais bastante bien, un abrazo a tod@s y hasta el siguiente post.

Pd: Ya sabéis que todos los ejemplos están basados en python 2.x, exactamente en python 2.7.


5 comentarios:

Dr Coloso dijo...

Te hago una consulta, me podrias explicar por q no imprime nada en pantalla.

class animal():
... def __init__():#contructor | inicializador
...... print "El animal ha nacido."
... def comer():
...... print "El animal esta comiendo."
... def reproducir():
...... print "El animal se esta reproduciendo."
... def morir():
...... print "El animal ha muerto. T_T"

class tiburon(animal): # otra clase, que hereda los metodos de animal
... def nadar():
...... print "El tiburon esta nadando."
... def cazar():
...... print "El tiburon esta cazando."


tibu = tiburon #no pongo los parentesis por que da error init no lleva argumentos
tibu.comer
tibu.nadar
tibu.cazar
tibu.reproducir
tibu.morir

Francisco Dominguez Lerma dijo...

....dr coloso, a mi no me da error, asegurate de copiarlo bien, y además no puedes hacer un copy paste de los ejemplos, tienes que escribirlos a mano por que si no te da error de indentación.

Dr Coloso dijo...

Hola, sigue sin aparecer el print el ejemplo que te expuse.
Tendria que decir:
"El animal ha nacido."
"El animal esta comiendo."
"El tiburon esta nadando."
"El tiburon esta cazando."
"El animal se esta reproduciendo."
"El animal ha muerto."

Queria sacarme la duda, por que o no implemente bien la herencia entre clases o me falta inicializar algo.

Francisco Dominguez Lerma dijo...

Vale, ya he dado con el problema, es que uno no puede crear métodos sin nada dentro, hay que especificarle siempre un "self" aunque no se vaya a usar, perdona es que esto no lo sabía lo siento, el código ya lo tienes arreglado en el post.

Saludos.

Francisco Dominguez Lerma dijo...

Es que la Poo no es mi fuerte, ya que a mi me gusta la programación funcional, cuando programaba en python para mis proyectos, solo usaba funciones, por eso en la Poo tengo alguna pequeña laguna, pido disculpas.