Mensajes entre instancias.

Pepe Aracil pepe en diselpro.com
Lun Mar 13 16:31:45 CET 2006


Opps!! El mailman borra los attach :(

Aqui va un copypaste:



#! /usr/bin/python
import weakref

class Broadcast:
     def __init__(self):
         self.messages={}

     def __purge(self):
         for msg in self.messages:
             self.messages[msg] = [l for l in self.messages[msg] if l() <> None]
             if len(self.messages[msg]) == 0:
                 del(self.messages[msg])

     def register(self,owner,messages):
         self.__purge()
         wr_owner = weakref.ref(owner)
         if not isinstance(messages,(list,tuple)):
             messages = (messages,)

         for msg in messages:
             if not (msg in self.messages):
                 self.messages[msg] = []
             if not (wr_owner in self.messages[msg]):
                 self.messages[msg].append(wr_owner)

     def unregister(self,owner,messages):
         wr_owner = weakref.ref(owner)
         if not isinstance(messages,(list,tuple)):
             messages = (messages,)

         for msg in messages:
             if not (msg in self.messages):
                 continue
             if (wr_owner in self.messages[msg]):
                 self.messages[msg].remove(wr_owner)

     def unregister_all(self,owner):
         all_messages = self.messages.keys()
         self.unregister(owner,all_messages)

     def broadcast(self,sender,message,*params):
         for lst in self.messages[message]:
             ref=lst()
             if ref:
                 ref.broadcast_cb(sender,message,*params)


if __name__=="__main__":

     class WindowA:
         def __init__(self,broadcast):
             self.broadcast = broadcast
             self.broadcast.register(self,("Mensaje1","Mensaje2"))

         def broadcast_cb(self,sender,message,*params):
             print "Recibido desde %s" % self
             print "Enviado por %s" % sender
             print "Mensaje %s" % message
             print "Paramatros extra %s" % (params,)
             print

     class WindowB:
         def __init__(self,broadcast):
             self.broadcast = broadcast
             self.broadcast.register(self,("Mensaje1"))

         def broadcast_cb(self,sender,message,*params):
             print "Recibido desde %s" % self
             print "Enviado por %s" % sender
             print "Mensaje %s" % message
             print "Paramatros extra %s" % (params,)
             print


     broadcast = Broadcast()
     wina=WindowA(broadcast)
     winb=WindowB(broadcast)

     broadcast.broadcast(None,"Mensaje1",1,2,3)
     broadcast.broadcast(None,"Mensaje2",3,4,5)
     print

     broadcast.unregister(wina,"Mensaje2")
     print "wina se ha desregistrado de Mensaje2"
     broadcast.broadcast(None,"Mensaje1",1,2,3)
     broadcast.broadcast(None,"Mensaje2",3,4,5)
     print

     del(winb)
     print "winb eliminada"
     broadcast.broadcast(None,"Mensaje1",1,2,3)
     broadcast.broadcast(None,"Mensaje2",3,4,5)
     print




Más información sobre la lista de distribución Python-es