【问题标题】:Pyro4 and plain old data objectsPyro4 和普通的旧数据对象
【发布时间】:2018-05-17 04:59:50
【问题描述】:

我有一个用 Pyro4 公开的对象,它返回一个 POD 对象:

import Pyro4

@Pyro4.expose
class POD:
    def __init__(self):
        self.a = 1

@Pyro4.expose
class Source:
    def get(self):
        p = POD()
        daemon.register(p)
        return p

daemon = Pyro4.daemon()
ns = Pyro4.locateNS()
uri = daemon.register(Source)
ns.register('test_obj', uri)
daemon.requestLoop()

但是当我尝试像这样检索这个对象时:

import Pyro4
s = Pyro4.Proxy('PYRONAME:test_obj')
o = s.get()
print(o.a)

我遇到这样的异常:

Pyro4.errors.PyroError: remote object doesn't expose any methods or attributes. Did you forget setting @expose on them?

有什么方法可以返回 POD 对象并使用它们的字段,还是我需要通过方法或属性公开这些字段?

【问题讨论】:

    标签: python python-3.x pyro4


    【解决方案1】:

    来自服务器端的文档,Creating a Pyro class and exposing its methods and properties 部分:

    您不能直接公开属性。如果您想提供可远程访问的属性,则需要为它们提供@property 并使用@expose 进行装饰。

    所以您需要将POD 类更改为:

    @Pyro4.expose
    class POD:
        def __init__(self):
            self._a = 1
    
        @property
        def a(self):
            return self._a
    
        # Only necessary when setting the property should be possible.
        @a.setter
        def a(self, value):
            self._a = value
    

    【讨论】:

    • 您正在链接到 Pythonhosted.org 上的旧文档,据我所知,很遗憾无法再更新。文档已移至 Readthedocs.io,而不是 pyro4.readthedocs.io/en/latest/…
    猜你喜欢
    • 2010-10-18
    • 2011-07-25
    • 2011-01-16
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多