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

Roberto Alsina ralsina en netmanagers.com.ar
Mar Mar 20 13:59:09 ART 2012


On 3/20/2012 1:55 PM, Manuel Kaufmann wrote:
> 2012/3/20 Manuel Kaufmann<humitos en gmail.com>:
>> Ahora que ya sé esto, sigo investigando porqué igualmente no funciona
>> lo que quiero arreglar :S
> El problema que tengo está relacionado con GTK básicamente. La cosa viene así
>
> ## window.py
>
> class Window(gtk.Window):
>
>      def __init__(self, **args):
>          gtk.Window.__init__(self, **args)
>          [.....]
>          self.connect('key-press-event', self.__key_press_cb)
>
>      def __key_press_cb(self, widget, event):
>          # Do something that I DON'T WANT
>          log.debug('Quiero que NO ME LLAMEN a mi!!')
>
> [........]
>
> ## activity.py
>
> class Activity(Window, gtk.Container):
>
>       def __init__(self, handle, create_jobject=True):
>          [...]
>          Window.__init__(self)
>          [...]
>
>
> [.......]
>
> ## terminal.py
>
> class TerminalActivity(activity.Activity):
>
>      def __init__(self, handle):
>          activity.Activity.__init__(self, handle)
>
>      def __key_press_cb(self, widget, event):
>          # Do the MAGIC here
>          log.debug('Quiero que me llamen a mi!!')
>
> [.......]
>
>
> Dentro de la clase Window, cuando es llamada por TerminalActivity
>
>   - self =<TerminalActivity object at 0x8ba8b6c (SugarActivity at 0x8b03970)>
>   - self.__key_press_cb =<bound method TerminalActivity.__key_press_cb
> of<TerminalActivity object at 0x8ba8b6c (SugarActivity at
> 0x8b03970)>>
>
> Por lo que SUPUESTAMENTE se estarían conectando las señales de la
> forma que yo quiero, aunque no pasa eso lamentablemente, sino que se
> sigue conectando el __key_press_cb de Window en vez del de
> TerminalActivity. No estoy seguro que esto tenga que ver con que los
> métodos tengan double underscore al inicio.
>
> Por otro lado, si en TerminalActivity.__init__ hago:
>
> self.disconnect_by_func(self.__key_press_cb)
>
> Me da un traceback:
>
> TypeError: nothing connected to<bound method
> TerminalActivity.__key_press_cb of<TerminalActivity object at
> 0x906db6c (SugarActivity at 0x8fc9170)>>
>
> o
>
> self.disconnect_by_func(TerminalActivity._TerminalActivity__key_press_cb)
>
> Me dice:
>
> TypeError: nothing connected to<unbound method TerminalActivity.__key_press_cb>
>
> o
>
> self.disconnect_by_func(Window._Window__key_press_cb)
>
> El error es:
>
> TypeError: nothing connected to<unbound method Window.__key_press_cb>
>
>
> Entonces, por un lado no entiendo porqué no se conecta el método
> __key_press_cb de mi clase TerminalActivity y por el otro tampoco
> entiendo porqué no puedo desconectar __key_press_cb de Window (ya que
> de alguna u otra forma se conecta por ese método se ejecuta y
> funciona)
>

La conexion la haces en la clase Window. Cuando estas en Window, __algo 
esta mangleado para que sea SOLO de Window. Si despues una clase que 
hereda Window dispara el evento, se sigue llamando al metodo de Window.

O sea, hace de cuenta que

self.connect('key-press-event', self.__key_press_cb)

en realidad dice

self.connect('key-press-event', self.__Window_key_press_cb)





More information about the pyar mailing list