viernes, 30 de mayo de 2014

Python, lo bello es mejor que lo feo


En el post anterior vimos como crear una clase en Python. Comparado con lenguajes como Java es bastante sencillo.

 /*Java*/
public class Submarino{
     private java.util.List<String> tripulacion;

     public Submarino(){} 
     //getters y setters
     ...
     ...
}

'''
Python
'''
class  Submarino(object):
       def __init__(self,tripulacion):
               self.tripulacion=tripulacion

Esto solo para crear una clase, pero si necesito que una clase herede atributos y método de una clase ... ¿existe la herencia en Python?. La respuesta es si.

#clase Padre
class Submarino(object):
         def tipo(self):
             print "submarino militar"

#clase hija
class Submarino_Juguete(Submarino):
        def tipo(self):
            print "submarino de juguete"

#main
submarinoJuguete=Submarino_Juguete()
submarinoJuguete.tipo()
print "tipo clase: ",type(submarinoJuguete) #tipo Submarino_Juguete

La clase hija 'Submarino_Juguete' hereda de la clase padre 'Submarino' sus atributos y propiedades.Además de poseer los suyos.

#ahora actúa como clase padre
class Submarino_Juguete(Submarino):
         def __init__(self,marca):
            self.marca=marca
            print "Submarino_Juguete"

       def tipo(self):
            print "submarino de juguete"


#clase hija
class Submarino_Madera(Submarino_Juguete):
          def  __init__(self):
             print "Submarino_Madera"

#main
submarinoMadera=Submarino_Madera()
submarinoMadera.tipo()


La clase 'Submarino_Juguete'  también puede actuar como clase padre, en este caso de la clase 'Submarino_Madera'.

Method Resolution Order
Básicamente se trata de una forma para hallar el método correcto en clases que tienen múltiples herencias.

#clase padre
class Serpiente_Reyna(object):
    def aviso(self):
        print "Serpiente Reyna ... activa"

#clase hija de 'Serpiente_Reyna'
class Serpiente_Roja(Serpiente_Reyna):
    def aviso(self):
        print "Serpiente Roja ... detenida"

#clase hija 
de 'Serpiente_Reyna' 
class Serpiente_Azul(Serpiente_Reyna):
    def aviso(self):
        print "Serpiente Azul ... esperando"

#clase con múltiple herencia
class Contenedor_Serpientes(Serpiente_Azul,Serpiente_Roja):

    pass

#main
azul=Serpiente_Azul()
roja=Serpiente_Roja()
contenedor=Contenedor_Serpientes()

azul.aviso()
roja.aviso()
contenedor.aviso() 


'''
en contenedor.aviso() se mostrará: Serpiente Azul ... esperando
'''
#con esto podemos ver el orden
print Contenedor_Serpientes.__mro__





Salida:
Serpiente Azul ... esperando
Serpiente Roja ... detenida
Serpiente Azul ... esperando
(<class '__main__.Contenedor_Serpientes'>, <class '__main__.Serpiente_Azul'>, <class '__main__.Serpiente_Roja'>, <class '__main__.Serpiente_Reyna'>, <type 'object'>)



  
Links
http://python-history.blogspot.mx/2010/06/method-resolution-order.html
http://mundogeek.net/archivos/2008/03/05/python-orientacion-a-objetos/
https://www.python.org/download/releases/2.3/mro/
http://stackoverflow.com/questions/1848474/method-resolution-order-mro-in-new-style-python-classes

No hay comentarios:

Publicar un comentario

Programación Windows Batch (CMD) parte 4

Siguiendo con la serie de post sobre programación ( 1 , 2 , y 3 ) batch ahora veremos algunas cosas como operaciones aritméticas, operad...