В приведенном ниже примере обе последние строки в методе B.Go() вызывают метод Go() из class A. Они функционально идентичны? Единственное преимущество использования super() в том, что мне не нужно знать унаследованное имя класса?
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()
Нет, super() делает прямой вызов A.Go , не может .super(B, self).Go() вызывает следующий метод в порядке разрешения методов.Он вызывает метод, который был бы вызван , если бы B не реализовал метод вообще.При прямом линейном наследовании это всегда A, поэтому реальной разницы нет (кроме повторяемого класса). Однако в случае множественного наследования следующий класс в обычном порядке разрешения методов не обязательно является прямым базовым классомтекущий класс.См. Объяснение наследования алмазов в оригинальном объяснении Гвидо этих функций.
A.Go
super(B, self).Go()
B
A
В дополнение к превосходному ответу, предоставленному Томасом Воутерсом , я бы добавил, что super() также очень полезен, потому что это вычисленная косвенность. Одним из ключевых преимуществ использования super() является то, что вам не нужно указывать класс делегата по имени, что позволяет легко изменить базовый класс позже. У Раймонда Хеттингера есть отличный пост об этом: супер () Python считается супер!
Не совсем.При использовании super вам нужен только экземпляр B, есть один экземпляр.Вторая строка создает новый экземпляр A, может иметь побочные эффекты в инициализаторе и не разделяет другой атрибут или состояние экземпляра (экземпляра B inst).
inst
Они совершенно разные. Вызывая A (). Go (), вы создаете совершенно новый объект, который не имеет общего атрибута с экземпляром, в котором он был создан.
Ваш пример слишком прост, вам нужно состояние, чтобы показать реальное поведение