Pyro4,如何服务带构造函数参数的对象?

1 投票
2 回答
1368 浏览
提问于 2025-04-17 06:26

我有一个对象,它在创建的时候需要传入一个参数。我想知道如何通过Pyro4来提供这个对象。举个例子:

import Pyro4

class MyPyroThing(object):
    def __init__(self, theNumber):
        self.Number = theNumber

Pyro4.Daemon.serveSimple(
    {
        MyPyroThing(): None
    },
    ns=True, verbose=True)

肯定会失败,因为构造函数需要一个参数。

那么解决这个问题后,如何调用这样的对象呢?

theThing = Pyro4.Proxy("PYRONAME:MyPyroThing")

编辑:

我觉得这个问题写得不太对,看看我下面的回答。

2 个回答

1

你可以不使用 Pyro4.Daemon.serveSimple,而是按照以下步骤来操作:

  • 首先,使用 Pyro4.locateNS 来获取名字服务器。
  • 然后,创建一个 Pyro4.Daemon 对象。
  • 接下来,创建你需要公开的对象。
  • 使用这个守护进程的 register 方法,把这些对象注册上去,让它们可以被访问。
  • 再用名字服务器的 register 方法,为这些对象提供一个名字和URI的对应关系。
  • 最后,启动守护进程的循环,让它开始工作。

代码大致会是这样的:

import Pyro4

name_server = Pyro4.locateNS()
daemon = Pyro4.Daemon()
my_object = MyPyroThing(parameter)
my_object_uri = daemon.register(my_object)
name_server.register('MyPyroThing', my_object_uri)

daemon.requestLoop()

完成这些步骤后,my_object 的URI就会在名字服务器中以 MyPyroThing 的名字可用。

3

上面的回答并没有真正解决我的问题,意思是我表达得不够清楚,真是抱歉。

我想在客户端调用一个实例,但Pyro4的工作方式并不是这样。实际上,类是在服务器上创建的,然后这个实例会通过网络传输过来。

在给Irmin(原开发者)发邮件后,我才明白Pyro4是怎么工作的。

现在我使用一种工厂模式,向工厂请求一个对象的实例。例如:

psf = Pyro4.Proxy("PYRONAME:MyApp.Factories.ProductFactory")
product = psf.GetProductOnButton(buttonNoPressed, parentProductId)

这里的product是Product()类的一个实例。因为这个实例已经在Pyro守护进程中注册,所以我也可以在这个Product()实例上调用方法。想知道我灵光一现的时刻,可以看看购物车的例子。

撰写回答