Observer-Pattern by (simple) decorator
David Wahler
dwahler at gmail.com
Sat Jun 2 06:55:27 EDT 2007
On Jun 2, 12:27 am, Steven Bethard <steven.beth... at gmail.com> wrote:
> I think you want to define __get__ on your Observable class so that it
> can do the right thing when the method is bound to the instance:
>
> >>> class Observable(object):
> ... def __init__(self, func, instance=None, observers=None):
> ... if observers is None:
> ... observers = []
> ... self.func = func
> ... self.instance = instance
> ... self.observers = observers
> ... def __get__(self, obj, cls=None):
> ... if obj is None:
> ... return self
> ... else:
> ... func = self.func.__get__(obj, cls)
> ... return Observable(func, obj, self.observers)
> ... def __call__(self, *args, **kwargs):
> ... result = self.func(*args, **kwargs)
> ... for observer in self.observers:
> ... observer(self.instance)
> ... return result
> ... def add_callback(self, callback):
> ... self.observers.append(callback)
> ...
> >>> class SomeActor(object):
> ... @Observable
> ... def meth(self, foo):
> ... print foo
> ...
> >>> def callback(instance):
> ... print "Yippie, I've been called on", instance
> ... instance.bar = True
> ...
Is this desired behavior?
>>> a = SomeActor()
>>> b = SomeActor()
>>> a.meth.observers is b.meth.observers
True
>>> a.meth.add_callback(callback)
>>> b.meth(42)
42
Yippie, I've been called on <__main__.SomeActor object at 0x00C23550>
-- David
More information about the Python-list
mailing list