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