Унаследованный метод, не возвращающий данные - PullRequest
0 голосов
/ 13 сентября 2011

При создании подкласса базового класса унаследованный метод не работает должным образом.

Я разбил свой модуль на пару частей (извините, если за этим трудно следить), все в каталоге с именем 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(), унаследованного от BaseInterface. Этот метод запускается, потому что при его запуске возникает пауза, но я не возвращаю никаких данных. Я ожидаю увидеть текст, возвращенный перезаписанными методами 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
>>> 

Что я делаю не так?

Ответы [ 3 ]

2 голосов
/ 14 сентября 2011

Вы не возвращаетесь с 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
1 голос
/ 13 сентября 2011

Ваш метод restart() ничего не возвращает. Если вы хотите, чтобы оно возвращало возвращаемое значение, вам нужно в последней строке прочитать return self.up(). В противном случае он всегда будет возвращать None, как сейчас - возврат по умолчанию для любой функции, которая не имеет явного возвращаемого значения.

0 голосов
/ 14 сентября 2011

изменить:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...