[pyar] Herencia en Python

Ignacio Rossi rossi.ignacio en gmail.com
Dom Feb 28 11:49:04 ART 2016


El 28 de febrero de 2016, 11:39, Ezequiel Trapani <etrapani04 en gmail.com>
escribió:

> Teniendo en cuenta lo que me indicaste. Cada vez que quiero llamar a un
> método de la clase padre tiene que ser así:
>
> ClasePadre.metodo(self,parametros)
>
> Porque tengo métodos redefinidos en los hijos pero necesito llamar al del
> padre.
>

Exacto, con clases que no heredan de object eso anda y tengo entendido que
se hace así.
Si heredan de object también anda, pero super es más claro y le deja el
laburo de resolver la clase padre a python.


>
> 2016-02-28 11:23 GMT-03:00 Ezequiel Trapani <etrapani04 en gmail.com>:
>
>> Gracias Ignacio, era ese el problema.
>>
>>
>>
>> 2016-02-28 11:10 GMT-03:00 Ignacio Rossi <rossi.ignacio en gmail.com>:
>>
>>>
>>>
>>> El 28 de febrero de 2016, 11:06, Ezequiel Trapani <etrapani04 en gmail.com>
>>> escribió:
>>>
>>>> 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?
>>>>
>>>
>>> Tenés que elegir explicitamente a que clase corresponde el metodo que
>>> queres usar, y llamarlo con el self en los parametros:
>>>
>>>     X.__init__(self, name, address)
>>>
>>>
>>>
>>>>
>>>> 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
>>>>
>>>> _______________________________________________
>>>> 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
>>
>
>
>
> --
> Ezequiel Trapani
>
> _______________________________________________
> 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/80ad0d14/attachment.html>


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