Методы с тем же именем и наследованием, Python - PullRequest
3 голосов
/ 10 августа 2011

У меня странный вопрос, и, поскольку реальный контекст довольно сложный, я привел простой пример.У меня есть два класса Base и Child .Каждый разделяет метод с тем же именем go .Я хочу, чтобы класс Child мог наследовать метод go от Base .Однако когда я вызываю метод go для Child , я хочу, чтобы он что-то делал (в этом случае умножьте атрибут A на 2), затем вызовите go метод, который он унаследовал от Base .

В этом примере вызов go on Base напечатает 35, а я хочу, чтобы Child напечатал 70.

class Base :
    def __init__ (self) :
        self.A = 35

    def go (self) :
        print self.A


class Child (Base) :
    def __init__ (self) :
        Base.__init__(self)

    def go (self) :
        self.A = self.A * 2

        # Somehow call Base's **go** method, which would print 70.

Я понимаю, что обычно это не очень хорошая идея (учитывая, что это может сбить с толку), однако в контексте того, что я делаю, это имеет смысл

1 Ответ

7 голосов
/ 10 августа 2011

Это абсолютно хорошая вещь. То, что вы ищете, это super().

class Child (Base):
    def __init__ (self):
        super(Child, self).__init__()

    def go(self):
        self.A = self.A * 2
        super(Child, self).go()

В Python 3 вы можете использовать его без аргументов, потому что он автоматически обнаружит правильные.

Редактировать: super() для классов нового стиля, которые вы должны использовать в любом случае. Просто объявите любой класс, который не наследуется от другого, как наследующий от object:

class Base(object):

Кроме того, все лишние пробелы до и после скобок не считаются хорошим стилем Python, см. PEP8 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...