Вызовите метод из высшего класса в иерархии вместо переопределения - PullRequest
2 голосов
/ 03 мая 2011

Допустим, у меня есть классы Base(object) и Derived(Base).Они оба реализуют функцию foo, с Derived.foo, переопределяющей версию в Base.

Однако в одном из методов, скажем Base.learn_to_foo, я хочу вызвать Base.foo вместопроизводная версия независимо от того, была ли она переопределена.Итак, я называю Base.foo(self) в этом методе:

class Base(object):
    # ...

    def learn_to_foo(self, x):
        y = Base.foo(self, x)
        # check if we foo'd correctly, do interesting stuff

Этот подход, кажется, работает и с точки зрения предметной области, он имеет смысл, но почему-то пахнет немного подозрительно.Это путь, или я должен рефакторинг?

Ответы [ 3 ]

3 голосов
/ 03 мая 2011

Ответ НЕ для использования функции super().То, что вы делаете, совершенно правильно, так как вы не хотите вызывать виртуальный метод, который переопределен в суперклассе.Поскольку вам, кажется, все время требуется точная реализация базового класса, единственный способ вернуть базовый класс несвязанный объект метода обратно, привязав его к self, что может быть экземпляром Base или Derived.Вызовите несвязанный метод с self, явно указанным в качестве первого параметра, который возвращает вам метод bound .С этого момента Base.foo будет действовать на данные экземпляра self.Это вполне приемлемо, и именно так Python работает с вызовом не виртуальных методов.Это одна из приятных вещей, которую Python позволяет вам делать, а Java - нет.

2 голосов
/ 03 мая 2011

Рекомендуется:

def learn_to_foo(self, x):
  super(Derived, self).foo(x)

Больше информации на http://docs.python.org/library/functions.html#super

1 голос
/ 03 мая 2011

Альтернативой является использование «супер» встроенного:

super(Derived, self).foo(x)     # Python 2

super().foo(x)                  # Python 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...