关闭

Python中实现通用代理对象

232人阅读 评论(0) 收藏 举报
分类:

现在需要做一个代理对象,其他人调用该对象方法时,代理hook到其调用,可进行处理,再将方法调用和参数转发给被代理对象,这个被代理对象可能只是另一个实例,可能在另一个进程里,也可能在另一台电脑上。直接给代理对象增加一堆被代理对象的接口即可,但是有没有通用的代理对象能适应任意函数调用呢?

# -*- coding:utf-8 -*-

class CallInfo(object):
    '''封装一次函数调用信息。'''
    def __init__(self, obj_name, func_name, *args, **kawrgs):
        '''调用是这样的:
        obj_name.func_name(*args, **kwargs)
        '''
        self.obj = obj_name
        self.func = func_name
        self.args = args
        self.kwargs = kawrgs

    def __str__(self):
        return "obj=%s, func=%s, args=%s, kwargs=%s" % (self.obj, self.func, self.args, self.kwargs)
        
        
class FuncProxy(object):
    def __init__(self, target_name, call_info_processor):
        self.__target_name = target_name
        self.__call_info_processor = call_info_processor

    def __getattribute__(self, name):
        if name.startswith("_"):
            return super(FuncProxy, self).__getattribute__(name)
        def trigger_func(*args, **kwargs):
            call_info = CallInfo(self.__target_name, name, *args, **kwargs)
            self.__call_info_processor(call_info)
        return trigger_func
        
class RemoteObjectProxy(object):
    '''该类可接受任意函数调用,再将该调用封装为CallInfo,发送到远端。
    远端可能是另一台机器或另一个进程等。
    '''
    # 省略其他通信部分
    # .....
    #----------------------------
    def __call__(self, call_target, proxy = False):
        '''生成FuncProxy类型代理对象。proxy应为True。'''
        if proxy:
            return FuncProxy(call_target, self.send_func_call)

    def send_func_call(self, call_info):
        # 省略发送call_info到远端的具体通信,用print代替
        print "Sending call_info is %s" % str(call_info)
        
        
if __name__ == "__main__":
    proxy = RemoteObjectProxy()
    proxy("a_remote_object", proxy=True).foo("paramA","paramB", key_param = 123, key_param2 = 456)


1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:48862次
    • 积分:741
    • 等级:
    • 排名:千里之外
    • 原创:25篇
    • 转载:4篇
    • 译文:0篇
    • 评论:18条
    文章分类
    最新评论