了解继承并将子变量传递给父类

时间:2014-04-01 20:52:22

标签: python args kwargs

我读了很多但仍然无法弄清楚如何将子变量传递给父类:

class anyIF_traffic(object):
    def __init__(self, logpath, typeOfTraffic='cha', name='mytest', port='6060'):
        try:
            assert port in [None, '6060', '6161', '6389', '6636']
            print "PORT: %s"%(port)
            self.port = port
        except AssertionError, msg:
            print "Exception"
            sys.exit (1)
    def __str__(self):
        return self.port

class a_traffic(anyIF_traffic):
    def _init__(self, *args, **kwargs):
        self.port = '6161'
        anyIF_traffic.__init__(self, *args, **kwargs)

class b_traffic(anyIF_traffic):
    def _init__(self, *args, **kwargs):
        self.port = '6389'
        anyIF_traffic.__init__(self, *args, **kwargs)

port = a_traffic(logpath='c://')
print "A. %s"%(port)

port = a_traffic(logpath='c://')
print "B. %s"%(port)

OUT: 
A. 6060

OUT: 
B. 6060

我想得到的是:

OUT: 
A. 6161

OUT: 
B. 6389

但是当我运行它时,我将始终获得默认值'6060',因为这是在父类_ init 中声明的。

当然我能做到:

port = a_traffic(logpath='c://', port='6161')
print "A. %s"%(port)

OUT: 
A. 6161

但我正在努力尽可能减少用户的参数。

我知道我的问题是我还没有完全理解类的pythons继承,而且在python中仍然是新的。

先谢谢。

3 个答案:

答案 0 :(得分:1)

问题是您在子类中分配覆盖后初始化了父级,包括默认端口6060。只需先初始化父级:

class a_traffic(anyIF_traffic):
    def _init__(self, *args, **kwargs):
        anyIF_traffic.__init__(self, *args, **kwargs)
        self.port = '6161'

有时在调用父 init 之前进行一些预先设置是有用的,但在其他99%的时间,首先初始化父。

答案 1 :(得分:1)

如果您希望port在子类中具有不同的默认值,则可以在将关键字参数字典传递给父类之前对其进行操作:

class a_traffic(anyIF_traffic):
    def _init__(self, *args, **kwargs):
        if len(args) < 4 and "port" not in kwargs:
            kwargs["port"] = "6161"
        anyIF_traffic.__init__(*args, **kwargs)

这允许只有一个地方self.port被分配,因此您不必担心子类是否覆盖父类设置的值,反之亦然。< / p>

答案 2 :(得分:0)

如果您对严格遵守继承范例感兴趣,只需将端口6161传递给超类构造函数:

class a_traffic(anyIF_traffic):
    def __init__(self, *args, **kwargs):
        if len(args) == 5:
            args[4] = '6161'
        else:
            kwargs['port'] = '6161'
        super(a_traffic, self).__init__(*args, **kwargs)