Функция Python super () - PullRequest
       10

Функция Python super ()

8 голосов
/ 15 июня 2011

В приведенном ниже примере обе последние строки в методе B.Go() вызывают метод Go() из class A. Они функционально идентичны? Единственное преимущество использования super() в том, что мне не нужно знать унаследованное имя класса?

class A(object):
    def Go(self):
        print "Calling A.Go()"

class B(A):
    def Go(self):
        super(B, self).Go()
        A.Go(self)

inst = B()
inst.Go()

Ответы [ 4 ]

14 голосов
/ 15 июня 2011

Нет, super() делает прямой вызов A.Go , не может .super(B, self).Go() вызывает следующий метод в порядке разрешения методов.Он вызывает метод, который был бы вызван , если бы B не реализовал метод вообще.При прямом линейном наследовании это всегда A, поэтому реальной разницы нет (кроме повторяемого класса). Однако в случае множественного наследования следующий класс в обычном порядке разрешения методов не обязательно является прямым базовым классомтекущий класс.См. Объяснение наследования алмазов в оригинальном объяснении Гвидо этих функций.

4 голосов
/ 15 июня 2011

В дополнение к превосходному ответу, предоставленному Томасом Воутерсом , я бы добавил, что super() также очень полезен, потому что это вычисленная косвенность. Одним из ключевых преимуществ использования super() является то, что вам не нужно указывать класс делегата по имени, что позволяет легко изменить базовый класс позже. У Раймонда Хеттингера есть отличный пост об этом: супер () Python считается супер!

2 голосов
/ 15 июня 2011

Не совсем.При использовании super вам нужен только экземпляр B, есть один экземпляр.Вторая строка создает новый экземпляр A, может иметь побочные эффекты в инициализаторе и не разделяет другой атрибут или состояние экземпляра (экземпляра B inst).

1 голос
/ 15 июня 2011

Они совершенно разные. Вызывая A (). Go (), вы создаете совершенно новый объект, который не имеет общего атрибута с экземпляром, в котором он был создан.

Ваш пример слишком прост, вам нужно состояние, чтобы показать реальное поведение

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