2011-09-13 100 views
0

當繼承基類時,繼承方法無法按預期工作。繼承方法不返回數據

我已經在一個名爲Lan的目錄中將我的模塊分成幾塊(對不起,如果這很難遵循)。

Lan/__init__.py

我:

from Bridge import Bridge 
from Ethernet import Ethernet 

from BaseInterface import BaseInterface 


def IfCtl(iftype): 
    for cls in BaseInterface.__subclasses__(): 
     if iftype in cls.iftypes(): 
      return cls() 
    raise ValueError 

Lan/Bridge.py

from Lan.BaseInterface import BaseInterface 

class Bridge(BaseInterface): 
    def __init__(self): 
     BaseInterface.__init__(self) 

    @staticmethod 
    def iftypes(): 
     return ['br', 'bridge'] 

    def up(self): 
     return 'Bringing up Bridge' 

    def down(self): 
     return 'Bringing down Bridge' 

終於在Lan/BaseInterface.py

from time import sleep 

class IfaceNotImplementedError(NotImplementedError): 
    def __init__(self, methodName): 
     self.methodName = methodName 
    def __str__(self): 
     return "Method %s must be subclassed" % self.methodName 

class BaseInterface(object): 
    @staticmethod 
    def iftypes(): return [''] 

    def up(self): raise IfaceNotImplementedError('up()') 

    def down(self): raise IfaceNotImplementedError('down()') 

    def restart(self, delay = 1.0): 
     self.down() 
     sleep(delay) 
     self.up() 

似乎一切都如預期,除了從繼承了restart()方法工作。該方法似乎運行,因爲我運行它時有一個暫停,但我沒有返回任何數據。我期望看到覆蓋的up()down()方法返回的文本。

>>> from Lan import IfCtl 
>>> InterFace = IfCtl('br') 
>>> print InterFace.down() 
Bringing down Bridge 
>>> print InterFace.up() 
Bringing up Bridge 
>>> print InterFace.restart() 
None 
>>> 

我在做什麼錯?

回答

1

您的restart()方法不會返回任何內容。如果你想讓它攜帶返回值,你需要閱讀最後一行return self.up()。否則,它將總是像現在一樣返回None - 任何沒有顯式返回值的函數的默認返回值。

+0

現在你說哦crap-那麼明顯。我感到很傻。 – tMC

+1

@tMC - 它發生了。這可能是關於這個問題最好的事情 - 讓別人注意這個問題。這比其他任何東西都更容易修復,恕我直言。 –

2

你是不是從restart

返回你要麼需要改變:

def up(self): 
    return 'Bringing up Bridge' 

def up(self): 
    print 'Bringing up Bridge' 

或變化:

def restart(self, delay = 1.0): 
    self.down() 
    sleep(delay) 
    self.up() 

def restart(self, delay = 1.0): 
    vals = [] 
    vals.append(self.down()) 
    sleep(delay) 
    vals.append(self.up()) 
    return vals 
0

變化:

def restart(self, delay = 1.0): 
    self.down() 
    sleep(delay) 
    self.up() 

到:

def restart(self, delay = 1.0): 
    print self.down() 
    sleep(delay) 
    print self.up()