滚动我自己的极轻量级'事件'系统

时间:2014-08-04 10:58:37

标签: python events eval observer-pattern

我使用的是Python 2.7,我想写一个小型库,这是一种“事件系统”。基本上,我有字段对象(目前只有两个属性,但可能会在以后更改),以及包含字段的标准对象。

标准类传递一个包含字段对象的表达式,Criterion类是字段的观察者,这样只要其中一个包含的字段属性(例如值等)发生变化,它就会触发Criterion类重新评估自身检查表达式是否为真。

如果表达式的计算结果为true,则Criterion类会执行某些操作 - 现在可能会打印到屏幕上。

class Field(Object):
    def __init__(self, id, name, value):
        self.id = id
        self.name =  name
        self.value = value

    def set_value(newval):
        self.value = newval

    def __repr__(self):
        print self.id, self.name, self.value



# A criterion is constructed with an expression containing field objects
# It 'listens' to changes in the field attributes and reevaluates itself and checks if expression is now true
# When the expression is true, it prints to the console
class Criterion(Object):
    def __init__(self, express):
        parse_expression(express) # parses expression to get field objects (is this necessary?)
        self.fields = {}  # dictionary of fields


    # call back when one of the parsed and observed fields changes
    def upon_field_change(field):
        if eval_expression():
            # do something
            print "Criterion evaluated true upon field change: %s", field
            pass

    # evaluate expression with current field objects
    # returns boolean
    def eval_expression():
        pass


    # evaluates bolean True/False
    def __nonzero__():
        eval_expression()

上面的代码片段是我的头脑,我的问题是:

  1. 我是沿着正确的路线走,还是有更好的办法去做我想做的事情?
  2. 有没有更好的方法来编写上面的代码?

1 个答案:

答案 0 :(得分:0)

我认为你不应该重新发明轮子,有一个优秀的Python事件库 名为louie(之前为pydispatcher),只需使用它即可。它允许从中发射信号 任何Python对象,并执行回调。它可以正确处理引用,也可以 还有其他功能。

在您的方案中,louie可用于从Field对象向Criterion对象发出更改,例如。