[pyar] Herencia en Python

Ignacio Rossi rossi.ignacio en gmail.com
Dom Feb 28 11:02:48 ART 2016


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
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160228/9a7668e1/attachment.html>


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