通常,由其
Proxy使用的对象
multiprocessing.baseManager及其子类仅公开其引用的对象中的 方法
,而不公开属性。现在,这里
multiprocessing.Manager().Namespace提供,它提供了一个
Proxy子类,该子类 确实
提供对属性而不是方法的访问。我们可以创建自己的
Proxy类型,该类型继承自该类型,从而可以访问所有属性以及对
b函数的访问:
from multiprocessing.managers import baseManager, NamespaceProxyclass TestClass(object): def __init__(self, a): self.a = a def b(self): print self.aclass MyManager(baseManager): passclass TestProxy(NamespaceProxy): # We need to expose the same __dunder__ methods as NamespaceProxy, # in addition to the b method. _exposed_ = ('__getattribute__', '__setattr__', '__delattr__', 'b') def b(self): callmethod = object.__getattribute__(self, '_callmethod') return callmethod('b')MyManager.register('test', TestClass, TestProxy)if __name__ == '__main__': manager = MyManager() manager.start() t = TestClass(1) print t.a mt = manager.test(2) print mt.a mt.a = 5 mt.b()输出:
125
编辑:
如果您希望能够将方法从原始类动态添加到Proxy类,则可以执行以下操作:
from multiprocessing.managers import baseManager, NamespaceProxyimport inspectclass TestClass(object): def __init__(self, a): self.a = a def b(self): print self.aclass AnotherClass(object): def __init__(self, a): self.a = a def c(self): print self.aclass MyManager(baseManager): passclass Proxybase(NamespaceProxy): _exposed_ = ('__getattribute__', '__setattr__', '__delattr__')class TestProxy(Proxybase): passclass AnotherProxy(Proxybase): passdef register_proxy(name, cls, proxy): for attr in dir(cls): if inspect.ismethod(getattr(cls, attr)) and not attr.startswith("__"): proxy._exposed_ += (attr,) setattr(proxy, attr, lambda s: object.__getattribute__(s, '_callmethod')(attr)) MyManager.register(name, cls, proxy)register_proxy('test', TestClass, TestProxy)register_proxy('another', AnotherClass, AnotherProxy)if __name__ == '__main__': manager = MyManager() manager.start() mt = manager.test(2) ma = manager.another(3) mt.b() ma.c() mt.a = 5 ma.a = 6 mt.b() ma.c()


