我读了很多但仍然无法弄清楚如何将子变量传递给父类:
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中仍然是新的。
先谢谢。
答案 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)