我在多个设备上有许多服务器从SimpleXMLRPCServer继承子类,并且所有服务器都倾向于在端口9999上运行。但是,我想插入要监听的接口说
想:
server 0.0.0.0 9999
或:
server host=0.0.0.0 port=9999
得到:
server (*sys.argv[:1])
然后服务器因为排序而选择了错误的接口,或者因为基类太“聪明”而进行双归属。
基类通过从本地主机上可用的那些中选择一个来生成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的子类的args:
class Server(SimpleXMLRPCServer):
def __init__(self, port, host=None):
if host is None:
host = get_ip()
SimpleXMLRPCServer.__init__(self,addr=(host, port))
如果更改影响了所有4个子类,我会感到失望,客户不会知道有变化,但双归属现在可能适用于使用额外参数而不是potluck启动的类。
子类都这样做:
class Server(SimpleXMPLRPCServer):
def __init__(self, port=1234):
host = get_ip()
SimpleXMLRPCServer.__init__(self,(host, port))
和main()调用是: 服务器(* SYS,argv的[:1])
答案 0 :(得分:0)
我不确定我理解你要做的是什么,但让我对此进行一次尝试。
首先,SimpleXMLRPCServer
's constructor将(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
当然你可以通过monkeypatching SimpleXMLRPCServer.__init__
更改其界面来实现这一点......为什么?这只会导致混乱,因为任何阅读你的代码的人(包括你,从现在开始的6个月)都必须弄清楚为什么SimpleXMLRPCServer
不像文档所说的那样行事。你从中间阶层中获得了同样的好处,没有任何问题。