栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

访问类的多处理代理的属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

访问类的多处理代理的属性

通常,由其

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()


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610794.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号