class lin(object):
m=[]
def __call__(self, hand):
def hand_w(a):
return hand(self, a)
self.m.append(hand)
return hand_w
def send(self, a):
print "send start"
for hand in self.m:
hand(self, a)
print "send end"
ooo=lin()
@ooo
def h1(evt, a):
print "in event handle 1, the arg is %s" % a
@ooo
def h2(evt, a):
print "in event handle 2, the arg is %s" % a
ooo.send("test")
解释一下几个要点:
ooo 是 lin 的实例,我且理解为 lin 是一个发送消息的类,lin 有一个 send 方法,参数为消息主体;
在使用 events 时,我们可以用它提供的装饰器 @on_connect, @on_message 等, 装饰器的作用在于包裹(过滤)你对目标函数的调用, 在 events.py 第 67 行开始, 定义了 on_message 等均指向一个 Event 对象, Event 对象中有实现 __call__ 函数, 这标志着其对象可以被当作函数执行, 在 __call__ 中定义了装饰器回调函数 handler_with_channel。
整体运行过程为:
你定义了函数并绑定了装饰器如 @on_message, 这时会将目标函数追加到 on_message(Event对象) 的 handlers 中, 作为事件回调函数等待调用
在 views.py 中(我没细看其他的文件, 也许还有), 可以看到 import events 并在各个动作发生时调用了不同的 Event 对象(on_message 等就是实例,前面说了因为他有 __call__ 所以可以当作函数调用, 返回函数的函数可以作为装饰器) 的 send 函数触发事件
在 Event 实例的 send 中, 会遍历 handlers 执行你已经注册进去的事件回调函数
2013/11/13
把你给的代码改了下:
解释一下几个要点: