[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