Python中实现通用代理对象

原创 2016年06月01日 21:33:31

现在需要做一个代理对象,其他人调用该对象方法时,代理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)


版权声明:本文为博主原创文章,未经博主允许不得转载。

Python字典对象实现原理

字典类型是Python中最常用的数据类型之一,它是一个键值对的集合,字典通过键来索引,关联到相对的值,理论上它的查询复杂度是 O(1) : >>> d = {'a': 1, 'b': 2} >>> ...
  • dotedy
  • dotedy
  • 2015年12月27日 23:17
  • 1497

Mybatis Mapper动态代理方法 即 只写Dao接口 不谢Dao的实现类

Mapper动态代理方法:程序员只需要写dao接口(Mapper),而不需要写dao实现类,由mybatis根据dao接口和映射文件中statement的定义生成接口实现代理对象。可以调用代理对象方法...
  • liuqiang211
  • liuqiang211
  • 2015年08月07日 14:33
  • 4115

Spring Aop原理分析(一) - 建立AopProxy代理对象

Spring Aop原理分析(一) - 建立AopProxy代理对象
  • qq418517226
  • qq418517226
  • 2016年04月29日 15:12
  • 2383

Spring3.1.0实现原理分析(九).AOP创建代理对象的过程

大家好,今天我会用一个例子来讲解Spring创建bean代理对象的过程,为大家揭开Spring AOP的神秘面纱。在看这篇博客前我强烈建议读者先看下这两篇博客《Spring3.1.0实现原理分析(六)...
  • roberts939299
  • roberts939299
  • 2017年05月18日 10:49
  • 666

CGLIB 实现代理对象

CGLIB 编程步骤: 1. 加入库 cglib库 cglib-2.2.jar asm库(cglib 需要asm库,如果没有加入asm的jar文件,就会报asm错误) a...
  • zhangyingjie09
  • zhangyingjie09
  • 2015年05月31日 16:03
  • 619

spring aop 通过获取代理对象实现事务切换

摘要:在项目中,当使用多数据源的时候,业务复杂的时候,会出现数据源A的方法里面嵌套调用数据源B的方法,这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识指定对应...
  • sxdtzhaoxinguo
  • sxdtzhaoxinguo
  • 2016年12月08日 19:36
  • 2347

CGLIB 实现代理对象API

1. 加入库 cglib库 cglib-2.2.jar asm库(cglib 需要asm库,如果没有加入asm的jar文件,就会报asm错误) asm-3.1.jar  2. 定义C...
  • Magister_Feng
  • Magister_Feng
  • 2012年06月13日 12:22
  • 3262

java动态代理对象实现日志的拦截(annotation自定义注解方式)

java动态代理对象,实现日志的输出,另外自定义annotation,实现注解类动态对象日志的拦截。...
  • kevon_sun
  • kevon_sun
  • 2016年04月02日 22:50
  • 2644

【Spring源码--AOP的实现】(一)AopProxy代理对象的创建

本文通过配置ProxyFactoryBean案例,从源码的角度一步步分析创建Aop代理对象的过程。...
  • u013185616
  • u013185616
  • 2016年09月06日 18:53
  • 941

Spring AOP的实现之建立AopProxy代理对象

在Spring的AOP模块中,一个主要的部分是代理对象的生成,而对于Spring应用
  • zhangbojun888
  • zhangbojun888
  • 2014年10月25日 18:25
  • 297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Python中实现通用代理对象
举报原因:
原因补充:

(最多只允许输入30个字)