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