假设我有一个对象是另一个对象的属性。
import Pyro4
@Pyro4.expose
class ClassB:
def foo(self):
return 'Hello from ClassB::foo()'
@Pyro4.expose
class ClassA:
def __init__(self):
self._b = ClassB()
def foo(self):
return 'Hello from ClassA::foo()'
@property
def b(self):
return self._b
if __name__ == '__main__':
daemon = Pyro4.Daemon(host='localhost')
ns = Pyro4.locateNS(host='localhost', port=9090)
ns.register('ClassA', daemon.register(ClassA))
daemon.requestLoop()
在本地机器上,我运行这个
import Pyro4
if __name__ == '__main__':
ns = Pyro4.locateNS(host='localhost', port=9090)
uri = ns.lookup('ClassA')
a = Pyro4.Proxy(uri)
print(a.foo())
print(a.b.foo()) # Fails here
当我尝试调用 abfoo 时,它试图序列化 ab 并在本地调用 foo,但我想在远程 ClassA 实例上已经存在的 ClassB 实例上调用 foo。
当然,我可以向 ClassA 添加一个委托给 b.foo() 的方法,例如
def classA:
# ...
def foo_on_b(self):
return self._b.foo()
但我宁愿不那样做。