def ObserverProxy(method_names):
class Proxy:
def __init__(self):
self._observers = []
def add_observer(self, observer):
self._observers.append(observer)
def remove_observer(self, observer):
self._observers.remove(observer)
def create_method_proxy(method_name):
def method_proxy(self, *args, **kwargs):
for observer in self._observers:
getattr(observer, method_name)(*args, **kwargs)
return method_proxy
for method_name in method_names:
setattr(Proxy, method_name, create_method_proxy(method_name))
return Proxy()
if __name__ == "__main__":
# usage example
output_proxy = ObserverProxy(["write", "close"])
import sys
output_proxy.add_observer(sys.stdout)
output_proxy.add_observer(sys.stderr)
output_proxy.add_observer(file("somefile", "w"))
print >>output_proxy, "This goes to all observers"
output_proxy.close()