супер () странность в Python 3 - PullRequest
2 голосов
/ 14 января 2010

Я знаю, что это уже обсуждалось несколько раз, но никогда не было объяснения того, что происходит "под капотом".

Может ли кто-нибудь дать подробное объяснение того, почему комментирование в последней строке кода вызывает ошибку? Я знаю, что этот объект .__ init__ не принимает никаких аргументов, но почему код работает, когда строка закомментирована?

class A:
   def __init__(self, a):
      print("A constructor")
      super().__init__(a)
      self.a = a
      print("A constructor end")

class B:
   def __init__(self, b):
      print("B constructor")
      super().__init__()
      self.b = b
      print("B constructor end")


class C(A, B):
   def __init__(self, x):
      super().__init__(x)


c = C(42)
#a = A(33)

1 Ответ

6 голосов
/ 14 января 2010

В Python 3 каждый метод становится замыканием со скрытым значением, добавляемым для определяемого «текущего класса». Доступ к нему super() (без аргументов).

Super возвращает объект, который использует Порядок разрешения методов класса (MRO), а для экземпляров C это имеет B после A.

Не найдя B в MRO, super().__init__ в A вызовет объект .__ init__, которому нельзя передать какие-либо параметры.

Вы можете просмотреть MRO для класса, посмотрев на SomeClass .__ mro __.

Хотя в основном речь идет о 2.x, вы можете прочитать http://fuhm.net/super-harmful/.

...