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