Python - Duda en herencia múltiple con Python

 
Vista:

Duda en herencia múltiple con Python

Publicado por Ángel Luis (4 intervenciones) el 03/03/2010 00:02:24
Hola buenas noches. Veréis, necesito algo de ayuda porque no consigo aclararme con la herencia múltiple en Python. Actualmente trabajo con la versión 2.5.4, en Windows. Tengo el siguiente código, escrito en IDLE:

class e1(object):
def __init__(self):
self.var1 = None
self.var2 = None
self.var3 = None

class e2(object):
def __init__(self):
self.var2 = ''

class e3(e2, e1): pass

aux = e3()
# Y cuando voy a acceder a un atributo heredado de e1 me dice que no existe. Por ejemplo:
print aux.var1

Devuelve el siguiente error:

Traceback (most recent call last):
File "D:\python\poo\ej2.py", line 44, in <module>
print aux.var1
AttributeError: 'e3' object has no attribute 'var1'

Por otra parte, si cambio la definición de la clase e3, de manera e3(e1,e2) entonces si que lo hace bien, y no me reconoce el atributo de la clase e1 (algo normal, porque hace overrride). Según lo que he visto por ahí el MRO va de izquierda a dercha y en profundidad. Sin embargo aquí parece que se sobreescriben los atributos. No pasa con lo métodos, creo ver.

Espero podáis ayudarme, ya que llevo todo el día dándole vueltas y no consigo aclararme. Muchas gracias de antemano.

Un saludo.
Ángel Luis.

http://elviajedelnavegante.blogspot.com
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Duda en herencia múltiple con Python

Publicado por Angel Luis (4 intervenciones) el 03/03/2010 00:44:01
Hooola de nuevo. Soy yo mismo contestándome a mi mismo!!! Bueno, esta duda, que es interesante, no es más que un despiste monumental. Evidentemente lo que estoy haciendo es un override, no de los atributos, sino de todo un __ini__!!!. A ver, hay dos clases que heredan de object, pero solamente inicializo una, no la otra. Es por ello que con solo incluir la inicialización en e2 de e1 soluciono el problema. (Es muy tarde y llevo mucho tiempo delante del PC, me voy a dormir). Bueno, muchas gracias por todo, si alguien me ha leído, que creo que no. (Se me va la chapeta!). Gracias, y saludos.

Os dejo la solución, por si a alguien le interesa.

class e1(object):
def __init__(self):
self.var1 = None
self.var2 = None
self.var3 = None

class e2(object):
def __init__(self):
e1.__init__(self)
self.var1 = ''

class e3(e2, e1): pass

aux = e3()
print aux.var2
Devuelve: None
Correcto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Duda en herencia múltiple con Python

Publicado por Ángel Luis (4 intervenciones) el 03/03/2010 00:57:51
Hola de nuevo. Mira que voy de mal en peor. La solución anterior es correcta, pero no tiene sentido alguno. La verdadera solución es llamar a los __init__ desde e3, y no desde e2. La solución es esta:

class e1(object):
def __init__(self):
self.var1 = None
self.var2 = None
self.var3 = None

class e2(object):
def __init__(self):
self.var1 = ''

class e3(e2, e1):
def __init__(self):
e2.__init__(self)
e3.__init__(self)

aux = e3()
print aux.var2
Devuelve: None
Correcto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar