我正在尝试包装我的xml-rpc服务器(python 2.7) 我正在使用此post
中的代码这是我的代码:
class XMLRPCWrapperProxy(object):
def __init__(self, wrapped=None):
if wrapped is None:
wrapped = xmlrpclib.ServerProxy('http://xxx.xxx.xxx.xxx:xxxx')
self.tf = wrapped
def __getattr__(self, name):
print "before"
attr = getattr(self.tf, name)
print "after"
return type(self)(attr)
def __call__(self, *args, **kw):
return self.tf(*args, **kw)
server_w = XMLRPCWrapperProxy()
server_w.tf.do_function1()
server_w.tf.do_function2(param1)
server_w.tf.do_function3()
server_w.tf.do_function4(param1)
我想wrap do_fuxntion...
调用但由于某种原因我看不到打印语句,我想我正在包装self.tf而不是调用方法,任何想法我怎么能扭曲任何方法调用?
答案 0 :(得分:1)
这可能相当明显,但您无法看到print语句,因为永远不会调用__getattr__
方法。如果我理解正确的意图,我怀疑你的电话会遗漏.tf
部分。因此它应该是:
# ...
server_w.do_function1()
server_w.do_function2(param1)
server_w.do_function3()
server_w.do_function4(param1)
答案 1 :(得分:1)
如果要包装tf
,为什么在测试中调用server_w.tf
?
这使得包装毫无意义。
如果您尝试server_w.do_function1()
,您会看到print-statements。
我不明白你用type(self)(attr)
行试图实现的目标......
我会尝试__getattr__
,就像这样:
def __getattr__(self, name):
print "before"
attr = getattr(self.tf, name)
print "after"
return attr
这应该正确返回包装对象的功能。