[pyar] Herencia en Python

Ezequiel Trapani etrapani04 en gmail.com
Dom Feb 28 11:06:54 ART 2016


Gracias por responder Ignacio, exactamente como decís vos tengo que usar
python 2.7. En ese caso como hago el llamado al constructor del padre?

2016-02-28 11:02 GMT-03:00 Ignacio Rossi <rossi.ignacio en gmail.com>:

> Hola Ezequiel;
>
> El 28 de febrero de 2016, 10:40, Ezequiel Trapani <etrapani04 en gmail.com>
> escribió:
>
>> Buenos días,
>>
>> Estoy haciendo un curso sobre python y tengo una actividad en la que
>> tengo que aplicar POO y usar herencia. El problema es el siguiente, tengo
>> una clase X y una clase Y que hereda de X. Cuando defino el constructor de
>> Y, tengo que llamar al constructor de X. El problema es que me sale el
>> siguiente error:
>>
>> Traceback (most recent call last):
>>   File "submission.py", line 64, in __init__
>>     super(self.__class__, self).__init__(name,desired_species)
>> TypeError: must be type, not classobj
>>
>> La definición del constructor de la clase Y es la siguiente:
>>
>>
>> class Y(X):
>>     def __init__(self, name,adress, cellphone):
>>         super(self.__class__, self).__init__(name,adress)
>>         self.cellphone =  cellphone
>>
>> Leyendo en foro detecte que el problema es que la clase X esta definida
>> de la siguiente manera:
>>
>> "class X:" y no "class X(object):" Si yo  ajusto el programa a la segunda
>> declaración el problema se resuelve. Sin embargo en el curso que estoy
>> haciendo yo no puedo modificar la clase X, solo tengo que agregar el código
>> de la clase Y para resolver el problema. Mi pregunta es existe alguna otra
>> forma de declarar el constructor de Y, para solucionar el problema?
>>
>
> Suena a que te esta mordiendo python 2 vs python 3. En python 3 todas las
> clases heredan de object, aunque no lo indiques. En python 2 no.
> Si corrés el código con python3 debería andar, ¿Quizás el tutorial está
> asumiendo py3?
>
> Por otro lado, un tema no menor: cuando usas super no tenés que usar
> self.__class__, sino el nombre explicito de la clase:
>
>     super(Y, self).__init__(name, address)
>
> En tu ejemplo van a andar igual los dos, pero no son lo mismo:
> self.__class__ resuelve a la clase del objeto y super(klass, self) te
> devuelve self, pero con los métodos de la "clase padre" de klass.(comillas
> porque si tenes herencia múltiple hay que ver un par de detalles más, pero
> la idea está), entonces si tenes más de un nivel de herencia, pueden pasar
> cosas malas.
> Acá [0] te dejo un ejemplito de como esto puede salir muy mal :)
>
> Saludos y mucha suerte con el tutorial :)
>
> Ignacio
>
> [0] http://linkode.org/717qk1W0OVpHY6qOXYINv
>
>
>
>
>
>
>>
>>
>>
>> Desde ya muchas gracias.
>> Saludos,
>> Ezequiel
>>
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar
>> http://listas.python.org.ar/listinfo/pyar
>>
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>>
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
>> Argentina - http://www.usla.org.ar
>>
>
>
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
> Argentina - http://www.usla.org.ar
>



-- 
Ezequiel Trapani
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160228/9e226fd3/attachment.html>


Más información sobre la lista de distribución pyar