首页 > 解决方案 > Pyro4 和普通的旧数据对象

问题描述

我有一个用 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 对象并使用它们的字段,还是我需要通过方法或属性公开这些字段?

标签: pythonpython-3.xpyro4

解决方案


在服务器端的文档中,创建 Pyro 类并公开其方法和属性部分:

您不能直接公开属性。如果您想提供可远程访问的属性,则需要为它们提供一个@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

推荐阅读