0

我在从 SimpleXMLRPCServer 子类化的多个设备上有许多服务器,并且都倾向于在端口 9999 上运行。但是,我想插入要听的接口说

想:

server 0.0.0.0  9999

或者:

server host=0.0.0.0 port=9999

得到:

server (*sys.argv[:1])

然后服务器选择了错误的接口来监听,因为基类“太聪明”了。

基类通过从本地主机上可用的 IP 中选择一个来生成 IP。如何指定 IP 而不破坏所有子类的向后兼容性?

通常每台服务器都会接受一个端口,似乎总是 9999。然后通过 interfacelist 寻找一个不是 127.0.0.1 的端口。

建议:如果 arg 是一个数字,则假设它是一个端口。如果它的 IP 假设它是一个主机。

class Server(SimpleXMLRPCServer):
    def __init__(self, port=1234):
        host = get_ip()
        SimpleXMLRPCServer.__init__(self,addr=(host, port)) 

这感觉像是一个奇怪的妥协,因为它颠倒了 SimpleXMLRPCServer 子类的参数:

class Server(SimpleXMLRPCServer):
    def __init__(self, port, host=None):
        if host is None:
            host = get_ip()
        SimpleXMLRPCServer.__init__(self,addr=(host, port)) 

如果更改影响了所有 4 个子类,我会感到失望,客户不会知道有更改,但是双归现在可能会在类开始时使用额外的参数而不是聚餐。

子类都这样做:

class Server(SimpleXMPLRPCServer):
    def __init__(self, port=1234):
       host = get_ip()
       SimpleXMLRPCServer.__init__(self,(host, port)) 

并且 main() 调用是: Server(*sys,argv[:1])

4

1 回答 1

0

我不确定我是否理解你想要做什么,但让我试一试。

首先,SimpleXMLRPCServer的构造函数将一(host, port)对作为其addr参数。因此,您的子类必须如下所示:

class Server(SimpleXMLRPCServer):
    def __init__(self, *whatever):
        # host, port = something
        SimpleXMLRPCServer.__init__(self, (host, port)) 

没有办法解决这个问题。

如果您只是想避免if host is None在每个子类上写入位,只需插入一个中间类:

class BaseServer(SimpleXMLRPCServer):
    def __init__(self, port=1234, host=None):
        if host is None:
            host = get_ip()
        SimpleXMLRPCServer.__init__(self, (host, port))

现在,您的每个子类都可以按照您想要的方式(我认为)编写:

class FirstServer(BaseServer):
    def __init__(self, port=1234, host=None):
        # any other initialization you need to do
        BaseServer.__init__(self, port, host)

class SecondServer(BaseServer):
    # no extra initialization at all needed for this subclass

当然你可以通过monkeypatchingSimpleXMLRPCServer.__init__来改变它的界面来做到这一点……为什么?这只会导致混乱,因为任何阅读您的代码的人(包括您,从现在起 6 个月后)都必须弄清楚为什么SimpleXMLRPCServer没有按照文档所说的方式行事。您从中级课程中获得相同的好处,没有任何问题。

于 2013-10-02T22:45:16.937 回答