佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 978|回复: 0

Implement event in Python

[复制链接]
发表于 3-11-2008 12:36 AM | 显示全部楼层 |阅读模式
Implement event in Python, here is the code. Simple right ?

import sys
def _functionId(obj, nFramesUp):
    """ Create a string naming the function n frames up on the stack. """
    fr = sys._getframe(nFramesUp+1)
    co = fr.f_code
    return "%s.%s" % (obj.__class__, co.co_name)
def abstractMethod(obj=None):
    """ Use this instead of 'pass' for the body of abstract methods. """
    raise Exception("Unimplemented abstract method: %s" % _functionId(obj, 1))

# Interface class ( not really interface, cause python dont support interface yet)
class IEventListener:
    def fire(self, *args, **kargs):
        """ fire event        """
        abstractMethod(self)
   
    def perform(self, *args, **kargs):
        """ perform task        """
        abstractMethod(self)   

#Singleton base class        
class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if '_inst' not in vars(cls):
            cls._inst = object.__new__(cls, *args, **kwargs)
        return cls._inst

# Event class need to be singleton, act like manager here       
class Event(Singleton):
    def __init__(self):
        print "event init..."
        
        if self._instance ==None:
            self._instance =1
            self.handlers = set()
            
    def handle(self, handler):
        self.handlers.add(handler)
              
    def unhandle(self, handler):
        try:
            self.handlers.remove(handler)
        except:
            raise ValueError("Handler is not handling this event, so cannot unhandle it."
        
    def fire(self, *args, **kargs):
        self.perform( *args, **kargs)
        
    def perform(self, *args, **kargs):
        for handler in self.handlers:
            handler.fire(*args, **kargs)        
    def getHandlerCount(self):
        return len(self.handlers)
    __iadd__ = handle
    __isub__ = unhandle
    __call__ = fire
    __len__  = getHandlerCount

#Some sample Listener class
class Literner1(IEventListener):
    def __init__(self):
        Event().handle(self)  # Subcribe to event manager, any event, please notify me...
   
    #event manage will trigger this is any event fired.   
    def fire(self, *args, **kargs):
        self.perform( *args, **kargs)
        
    def perform(self, *args, **kargs):
        print "erform event in listener 1"

#Sample listener 2
class Literner2(IEventListener):
    def __init__(self):
        Event().handle(self)
        
    def fire(self, *args, **kargs):
        self.perform( *args, **kargs)
        
    def perform(self, *args, **kargs):
        print "erform event in listener 2"        
        
            
   
if __name__=='__main__':
    e1 =Event()
    e2= Event()
   
    l1 = Literner1()
    l2 = Literner2()
   
    e1.fire("1"
    e2.fire("1" # e1 and e2 are the same instance.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 22-12-2025 04:18 PM , Processed in 0.115741 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表