2014-04-01 39 views
0

,我讀了很多,但還是無法弄清楚如何將孩子變量傳遞給父類:認識繼承和傳遞子變量父類

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」的缺省值,因爲這是在父類中聲明_ 初始化

我當然可以這樣做:

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

OUT: 
A. 6161 

,但我想有儘可能多的用戶可能不太參數來照顧過。

我知道我的問題是,我還沒有完全理解類的pythons繼承,並仍然在Python新。

謝謝進階

+0

你在哪裏把這些可怕的類名而來? :)另外請注意,'port'應該是一個'int'而不是'str';你需要它作爲一個字符串,只要做'str(port)'。 –

+0

感謝所有的意見和答案,但我確實嘗試了這些建議,但我仍然得到相同的輸出!我有可能也改變我的父母班嗎? – FotisK

+0

我明白了,愚蠢的新手錯誤!有用! – FotisK

回答

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) 
1

問題在於,在分配子類中的覆蓋之後,您已初始化父代,包括默認端口6060。只要先初始化父:

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

有時它在調用init父,但當時的另外99%之前,做一些預先的設置是有用的,首先初始化父。

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被分配的地方,所以你不必擔心子類是否覆蓋父類設置的值,反之亦然。