python改变超类init而不改变子类

时间:2013-10-02 22:30:09

标签: python kwargs

我在多个设备上有许多服务器从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])

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不像文档所说的那样行事。你从中间阶层中获得了同样的好处,没有任何问题。