[pyar] Herencia y métodos __ (double underscore)

Daniel Moisset dmoisset en machinalis.com
Mar Mar 20 13:20:49 ART 2012


2012/3/20 Manuel Kaufmann <humitos en gmail.com>:
> Hola lista,
>
> Estoy tratando de resolver un bug de OLPC[1] y me encontré con un
> problema de herencia. No estoy seguro si es así como debería funcionar
> o estoy meando afuera del tarro o encontré un bug de Python o he
> quemado demasiadas neuronas ya.

Es un comportamiento poco usado/poco conocido de Python llamado "name
mangling" http://docs.python.org/reference/expressions.html#atom-identifiers
cuya idea es permitirte tener nombres locales a una clase

> La cosa es así: tengo una clase Hola que tiene un método "__me_voy" y
> una clase Chau que también tiene un método "__me_voy". Chau hereda de
> Hola y en el __init__ de Hola se llama a self.__me_voy. ¿Cuál se
> debería llamar ahí el de Chau o el de Hola? Para mí el de Chau, pero
> para Python (que siempre sabe más que yo) dice que se debe llamar el
> de Hola.
>
> Acá el ejemplo en código:
>
> [humitos] [/tmp]$ cat test.py
> class Hola:
>    def __init__(self):
>        print 'Hola'
>        self.__me_voy()
>
>    def __me_voy(self):
>        print 'Hola - me voy'
>
>
> class Chau(Hola):
>    def __init__(self):
>        Hola.__init__(self)
>
>    def __me_voy(self):
>        print 'Chau - me voy'
>
> if __name__ == '__main__':
>
>    c = Chau()
>

Con el mecanismo que te mencione, esto que escribiste es syntactic sugar para

class Hola:
   def __init__(self):
       print 'Hola'
       self._Hola__me_voy()

   def _Hola__me_voy(self):
       print 'Hola - me voy'


class Chau(Hola):
   def __init__(self):
       Hola.__init__(self)

   def _Chau__me_voy(self):
       print 'Chau - me voy'

if __name__ == '__main__':
   c = Chau()

Una vez que ves a que se transforma lo que pusiste, es bastante obvio
porque nunca se ejecuta _Chau__me_voy (respuesta: porque nadie lo
llama)

Saludos,
  D.



More information about the pyar mailing list