Foros del Web » Programando para Internet » Python »

¿Herencia múltiple en Taxonomía de animales?

Estas en el tema de ¿Herencia múltiple en Taxonomía de animales? en el foro de Python en Foros del Web. Hola, no quiero demorar mas mi aprendizaje en POO y he creado una Taxonomía del reino animal. En principio, con los vertebrados. Esta claro, que ...
  #1 (permalink)  
Antiguo 04/01/2015, 05:26
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
¿Herencia múltiple en Taxonomía de animales?

Hola, no quiero demorar mas mi aprendizaje en POO y he creado una Taxonomía del reino animal. En principio, con los vertebrados. Esta claro, que luego hay un sin fin de subgrupos. Pero partiendo del grupo de vertebrados, solo llego a tres niveles para no hacerlo muy extenso.

Me gustaría saber, si en este código (esqueleto de clases) quitaríais alguna clase o bien, aplicaríais la herencia múltiple para no crear muchas clases.

De hecho, la duda de la herencia múltiple en este caso, es que luego no quiero que se solapen comportamientos raros entre animales. Es decir, que pongamos el método:

Código Python:
Ver original
  1. sapo.comer(bufalo)

Y el sapo se lo coma sin problemas al búfalo. Ya me entendéis. Creo, que al estar las clases como las pongo yo en el ejemplo, son más difíciles estas incongruencias.

Este es mi código de clases (Luego ya me meteré con el grupo de invertebrados):
(La instancia final sería la última hoja del árbol. Osea, el animal)

Código Python:
Ver original
  1. # REINO
  2. class ReinoAnimal:
  3.     pass
  4.  
  5. # CLASE GENERAL
  6.  
  7. class Vertebrados(ReinoAnimal):
  8.     pass
  9.  
  10. # 5 GRUPOS VERTEBRADOS
  11.  
  12. class Anfibios(Vertebrados):
  13.     pass
  14. class Aves(Vertebrados):
  15.     pass
  16. class Mamiferos(Vertebrados):
  17.     pass
  18. class Peces(Vertebrados):
  19.     pass
  20. class Reptiles(Vertebrados):
  21.     pass
  22.  
  23. # ANBIBIOS
  24.  
  25. class Urodelos(Anfibios):
  26.     pass
  27. class Anuros(Anbibios):
  28.     pass
  29.  
  30. # AVES
  31.  
  32. class Ratites(Aves):
  33.     pass
  34. class Carenadas(Aves):
  35.     pass
  36.  
  37. # MAMIFEROS
  38.  
  39. class Monotremas(Mamiferos):
  40.     pass
  41. class Marsupiales(Mamiferos):
  42.     pass
  43. class Placentarios(Mamiferos): #Aquí sale un subgrupo de nivel 3
  44.     pass
  45.  
  46. # MAMIFEROS/PLACENTARIOS
  47.  
  48. class Carnivoros(Placentarios):
  49.     pass
  50. class Cetaceos(Placentarios):
  51.     pass
  52. class Primates(Placentarios):
  53.     pass
  54. class Quiropteros(Placentarios):
  55.     pass
  56. class Roedores(Placentarios):
  57.     pass
  58. class Ungulados(Placentarios):
  59.     pass
  60.  
  61. # REPTILES
  62.  
  63. class Cocodrilos(Reptiles):
  64.     pass
  65. class Ofidios(Reptiles):
  66.     pass
  67. class Quelonios(Reptiles):
  68.     pass
  69. class Saurios(Reptiles):
  70.     pass
  71.  
  72. # PECES
  73.  
  74. class Condrictios(Peces):
  75.     pass
  76. class Osteoicteos(Peces):
  77.     pass
  #2 (permalink)  
Antiguo 04/01/2015, 11:46
 
Fecha de Ingreso: mayo-2013
Mensajes: 207
Antigüedad: 11 años
Puntos: 31
Respuesta: ¿Herencia múltiple en Taxonomía de animales?

Y a todo esto ¿qué hay de la herencia?
  #3 (permalink)  
Antiguo 04/01/2015, 13:04
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: ¿Herencia múltiple en Taxonomía de animales?

Cita:
Iniciado por alzacon Ver Mensaje
Y a todo esto ¿qué hay de la herencia?
Hombre, ya dije que era solo el esqueleto de clases. Luego, se trata de ir metiendo atributos y métodos.

Por ejemplo, la clase Marsupiales heredaran los métodos de mamíferos y vertebrados.

La duda que planteaba, es que dado como he jerarquizado las clases, si debería haber implantado la herencia múltiple. En todo caso, los atributos y métodos son los básicos. Luego, cada especie, iría añadiendo otros atributos de su especie.
  #4 (permalink)  
Antiguo 04/01/2015, 13:40
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: ¿Herencia múltiple en Taxonomía de animales?

No soy un experto en biología animal, pero que no la taxonomía se representa muy bien con herencia simple? Después de todo te lo ponen con un árbol.



Haciendo la herencia múltiple inpractica. Ademas no veo en ningún lugar la herencia múltiple. Siempre heredas de una sola clase en todas tus clases.

Ejemplo sencillo de herencia múltiple:
Código Python:
Ver original
  1. class A(object):
  2.     def a(self):
  3.         print "A"
  4.  
  5. class B(object):
  6.     def b(self):
  7.         print "B"
  8.  
  9. class C(A, B):
  10.     def c(self):
  11.         print "C"
  12.         self.b()
  13.         self.a()
  14.  
  15. c = C()
  16. c.c()

Lo interesante de la herencia múltiple es orden de resolución de los métodos y atributos.

Por ejemplo, aquí vemos como imprime C, B, A:
Código Python:
Ver original
  1. class A(object):
  2.     def __init__(self):
  3.         super(A, self).__init__()
  4.         print "A"
  5.  
  6. class B(object):
  7.     def __init__(self):
  8.         super(B, self).__init__()
  9.         print "B"
  10.  
  11. class C(A, B):
  12.     def __init__(self):
  13.         print "C"
  14.         super(C, self).__init__()
  15.  
  16. C()

Pero si cambiamos el orden.
Código Python:
Ver original
  1. class C(B, A):
  2.     def __init__(self):
  3.         print "C"
  4.         super(C, self).__init__()
Obtenemos C, A, B

Pero si vemos el mro. C.mro() vemos que la resolución esta al revés, esto es porque es importante también la llamada a super de los métodos.

Código Python:
Ver original
  1. class A(object):
  2.     def __init__(self):
  3.         print "A"
  4.         super(A, self).__init__()
  5.  
  6. class B(object):
  7.     def __init__(self):
  8.         print "B"
  9.         super(B, self).__init__()
  10.  
  11. class C(A, B):
  12.     def __init__(self):
  13.         print "C"
  14.         super(C, self).__init__()
  15.  
  16. C()

Si quieres aprender mas de mro te recomiendo ver la documentación.
https://www.python.org/download/releases/2.3/mro/

O tomar un libro de python donde expliquen a detalle herencia múltiple. Lamentablemente no hay tanto material en español como lo hay en ingles. Así que buena suerte con eso.
  #5 (permalink)  
Antiguo 04/01/2015, 19:06
 
Fecha de Ingreso: mayo-2013
Mensajes: 207
Antigüedad: 11 años
Puntos: 31
Respuesta: ¿Herencia múltiple en Taxonomía de animales?

Ah vale, no vi o se me olvido lo del solapamiento. Pero de todas formas depende de los atributos y métodos de las clases iniciales.
  #6 (permalink)  
Antiguo 05/01/2015, 10:29
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 4 meses
Puntos: 9
Respuesta: ¿Herencia múltiple en Taxonomía de animales?

He estado dándole un poco de forma a la clase y eliminando subclases. Para dejar los 5 grupos de vertebrados. Luego, en las 5 subclases es donde se pueden poner esos pocos atributos o métodos mas especializados de cada animal.

Yo creo que con la clase Vertebrados ya se pueden crear interacción entre animales.

Código Python:
Ver original
  1. class Vertebrados(object):
  2.    
  3.     def __init__(self):        
  4.         self.carnivoro = False
  5.         self.herbivoro = False
  6.         self.insectivoro = False
  7.         self.omnivoro = False
  8.         self.venenoso = False
  9.         self.potenciaVeneno = 0
  10.         self.inmunidadVeneno = 0
  11.         self.oxigeno = 100
  12.         self.nutrir = 0
  13.        
  14.     def caracteristicas(self):
  15.         self.comunes = ('- Organizacion celular: Eucariota y pluricelular.',
  16.                    '- Nutricion: Heterotrofa por ingestion.',
  17.                    '- Metabolismo: Aerobio (consumo oxigeno).',
  18.                    '- Reproducion: Sexual / Asexual.',
  19.                    '- Forma: Simetrica (Excepto las esponjas)')
  20.         for i in self.comunes:
  21.             print(i)      
  22.                                      
  23.                  
  24.     def comida(self, comida):
  25.         self.comida = comida
  26.         if self.comida == 'carne':
  27.             self.carnivoro = True
  28.             return ('Carnivoro')
  29.         elif self.comida == 'hierba':
  30.             self.herbivoro = True
  31.             return ('Herbivoro')
  32.         elif self.comida == 'insectos':
  33.             self.insectivoro = True
  34.             return ('Insectivoro')
  35.         elif self.comida == 'animales/plantas':
  36.             self.omnivoro = True
  37.             return ('Omnivoro')        
  38.         else:
  39.             return ('No conozco esa alimentacion')
  40.        
  41.     def comer(self):
  42.         self.nutrir += 5
  43.         return self.nutrir
  44.    
  45.     def respirar(self):
  46.         self.oxigeno -= 1
  47.         return self.oxigeno
  48.    
  49.     def excretar(self):
  50.         self.nutrir -= 2
  51.         return self.nutrir
  52.    
  53.     def responder(self, sonido):
  54.         self.sonido = sonido
  55.         print('¡¡¡' + self.sonido + '!!!')
  56.        
  57.     def mover(self):
  58.         print('Estoy caminando o volando o nadando')
  59.        
  60.     def reproducir(self):
  61.         print('Sin comentarios...jejeje')
  62.    
  63.     def atacar(self, animal):
  64.         self.animal = animal
  65.         if animal.venenoso == True:
  66.             print('¡El animal te he inyectado su veneno!')
  67.         else:
  68.             print('¡Que rico...!')
  69.    
  70.  
  71. # 5 GRUPOS VERTEBRADOS
  72.  
  73. class Anfibios(Vertebrados):
  74.     pass
  75. class Aves(Vertebrados):
  76.     pass
  77. class Mamiferos(Vertebrados):
  78.     pass
  79. class Peces(Vertebrados):
  80.     pass
  81. class Reptiles(Vertebrados):
  82.     pass

Luego, ya se podría entrar en el tema del encapsulamiento, polimorfismo y tal. Pero bueno, es mi primera clase creada.

Última edición por Koan; 05/01/2015 a las 10:54

Etiquetas: ip, múltiple, taxonomía
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:37.