Python中实现通用代理对象
2016-06-01 21:33
471 查看
现在需要做一个代理对象,其他人调用该对象方法时,代理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)
# -*- 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基础知识(3)
- Windows7 64位+python3.4环境下安装opencv3.0的方法
- python 语句5
- python语句(4)
- python 文件2学习
- python 文件1
- virtualenv 指定 python 解释器的版本
- Python学习之基础总结--3
- python的内建函数(BIF)range(start, stop, step)
- python Django错误解决:A server error occurred. Please contact the administrator.
- 同时安装 Python 2 和 Python 3环境下 pip 的使用
- paramiko多进程同步目录
- python中re模块(正则表达式模块)的使用学习
- 黑客语言Python
- Ubuntu14.04 64位+Python3.4环境下安装opencv3.0的方法
- python语言磁力搜索引擎源码公开,基于DHT协议,十二分有技术含量的技术博客
- KMP算法精解及其Python版的代码示例
- python语言磁力搜索引擎源码公开,基于DHT协议
- python语言磁力搜索引擎源码公开,基于DHT协议
- python(15)提取字符串中的数字