继承的方法不返回d

2024-07-04 05:21:13 发布

您现在位置:Python中文网/ 问答频道 /正文

当子类化基类时,继承的方法不能按预期工作。你知道吗

我已经将我的模块分成了几个部分(如果很难理解的话,很抱歉),全部放在一个名为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()

除了从BaseInterface继承的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
>>> 

我做错什么了?你知道吗


Tags: 方法fromimportselfreturninitdefinterface
3条回答

更改:

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

您的restart()方法不返回任何内容。如果希望它携带up的返回值,则需要最后一行来读取return self.up()。否则,它总是像现在一样返回None——任何没有显式返回值的函数的默认返回。你知道吗

你不是从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

相关问题 更多 >

    热门问题