Code: Alles auswählen
class Model(object):
    def __init__(self, value=None):
        self._value, self.observers = value, []
    
    def _getvalue(self):
        return self._value
    
    def _setvalue(self, value):
        if self._value != value:
            self._value = value
            for ob in self.observers:
                ob.update()
    
    value = property(_getvalue, _setvalue)
Code: Alles auswählen
class Filter(Model):
    def __init__(self, model, func):
        super(Filter, self).__init__()
        self._model, self._func = None, func
        self.model = model
    
    def _getmodel(self):
        return self._model
    
    def _setmodel(self, model):
        if self._model is not model:
            if self._model is not None:
                self._model.observers.remove(self)
            self._model = model
            if model is not None:
                model.observers.append(self)
            self.update()
    
    model = property(_getmodel, _setmodel)
    
    def _getfunc(self):
        return self._func
    
    def _setfunc(self, func):
        if self._func is not func:
            self._func = func
            self.update()
    
    func = property(_getfunc, _setfunc)
    
    def update(self):
        self.value = self._func(self._model.value) if self._model else None
    
    def release(self):
        self.model = None
Code: Alles auswählen
m = Model(0)
f = Filter(m, lambda: x: x * x)
m.value = 4
print f.value
Code: Alles auswählen
def no_none(func):
    def inner(*args):
        return func(*args) if all(args) else None
    return inner
Code: Alles auswählen
class Compose(Model):
    def __init__(self, models, func):
        super(Compose, self).__init__()
        self._models, self._func = models, func
        for m in self._models:
            m.observers.append(self)
        self.update()
    
    def _getfunc(self):
        return self._func
    def _setfunc(self, func):
        if self._func is not func:
            self._func = func
            self.update()
    func = property(_getfunc, _setfunc)
    
    def update(self):
        self.value = self._func(*tuple(m.value for m in self._models))
    
    def release(self):
        for m in self._models:
            m.observers.remove(self)
Code: Alles auswählen
a1 = Model()
a2 = Model()
a3 = Compose((a1, a2), no_none(lambda x, y: x + y))
print a3.value
a1.value = 3
print a3.value
a2.value = 4
print a3.value
