Pyro4 и простые старые объекты данных - PullRequest
0 голосов
/ 15 мая 2018

У меня есть объект, который я открываю с помощью 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 и использовать их поля, или мне нужно предоставлять эти поля через методы или свойства?

1 Ответ

0 голосов
/ 16 мая 2018

Из документации для серверной части, раздел Создание класса 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
...