Foros del Web » Programando para Internet » Python »

Registrar todos los bound methods usando un decorador

Estas en el tema de Registrar todos los bound methods usando un decorador en el foro de Python en Foros del Web. Hola, estoy queriendo registrar determinados metodos de una clase como Hooks en un sistema de plugins que estoy armando. Defino la clase de la siguiente ...
  #1 (permalink)  
Antiguo 04/12/2014, 10:09
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Registrar todos los bound methods usando un decorador

Hola, estoy queriendo registrar determinados metodos de una clase como Hooks en un sistema de plugins que estoy armando.
Defino la clase de la siguiente forma
Código Python:
Ver original
  1. class MiPlugin(Plugin):
  2.     @Hook('event-name')
  3.     def  miProcesador(self, value):
  4.         print(value)
El problema es que cuando Hook se ejecuta me registra el metodo independiente, y a mi me gustaria que el decorador me registre el metodo enlazado a la instancia (bound).

Alguna idea?

De que manera podria hacer que determinados metodos se auto registren a un evento cuando la clase es instanciada sin tener que hacerlo manualmente en el __init__?

Saludos
  #2 (permalink)  
Antiguo 04/12/2014, 21:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Registrar todos los bound methods usando un decorador

Cita:
El problema es que cuando Hook se ejecuta me registra el metodo independiente, y a mi me gustaria que el decorador me registre el metodo enlazado a la instancia (bound).

Alguna idea?
Aquí no te entiendo. Te refieres a que una vez que decoras el metodo este metodo decorado hace un override de ciertos atributos del metodo original? Si es así te recomiendo leer http://stackoverflow.com/questions/3...ngs-to-a-class

Si refieres a decorar el metodo. Del siguiente modo:
Código Python:
Ver original
  1. class A(object):
  2.     def __init__(self, *args, **kwargs):
  3.         self.foo = decorator(self.foo)
  4.  
  5.     def foo(self):
  6.         print 'foo'
Entonces WAT. No se me ocurre ningun escenario de porque esto es una buena idea.

Cuando esto es definitivamente mucho mejor
Código Python:
Ver original
  1. class A(object):
  2.     @decorator
  3.     def foo(self):
  4.         print 'foo'

Cita:
De que manera podria hacer que determinados metodos se auto registren a un evento cuando la clase es instanciada sin tener que hacerlo manualmente en el __init__?
Depende del criterio que uses para 'auto registrar'. Seguirias alguna convención? Lo especificarias explicitamente? Lo indicaras al generar la instancia? O desde antes?
  #3 (permalink)  
Antiguo 05/12/2014, 12:25
Avatar de korg1988  
Fecha de Ingreso: junio-2006
Ubicación: Santa Fe, Argentina
Mensajes: 825
Antigüedad: 18 años, 4 meses
Puntos: 19
Respuesta: Registrar todos los bound methods usando un decorador

No, me exprese terriblemente mal al parecer.
Lo que yo quiero es definir una clase, y sus respectivos metodos.
Luego, determinados metodos tienen que convertirse en listeners de determinados eventos del sistema.
Para eso cree un decorador que tome el nombre del metodo y lo añada como listener!
El problema es que el decorador toma el metodo como unbound.... y cuando la clase se instancia, ese metodo ya no es el unbound que habia sido registrado, sino que va a ser bound!....

Pongamoslo facil.

Quiero hacer que cada vez que se instancia una clase, un determinado metodo se registre como listener de un evento en el sistema! pero sin tener que hacerlo explicitamente en el __init__

No quiero algo asi:
Código Python:
Ver original
  1. class Test:
  2.     def __init__(self):
  3.         Events.addListener(‘miEvento’, Listener(self.mimetodo))
  4.     def mimetodo(self):
  5.         pass

Quisiera algo asi
Código Python:
Ver original
  1. class Test:
  2.     @Listener('miEvento')
  3.     def mimetodo(self):
  4.         pass
Cuando Listener obtenga el metodo "mimetodo" va a obtener su versión "unbound".... pero la que yo quiero llamar es la versión "bounded" de cada una de las instancias de la clase Test!

Mm no se como explicarlo

Etiquetas: gui, ip, usando
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:05.