Pyro4,如何服务带构造函数参数的对象?
我有一个对象,它在创建的时候需要传入一个参数。我想知道如何通过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()实例上调用方法。想知道我灵光一现的时刻,可以看看购物车的例子。