2010-01-13 2 views
2

Я знаю, что это обсуждалось несколько раз раньше, но никогда не было объяснений, что происходит «под капотом».super() странность в Python 3

Может ли кто-нибудь дать подробное объяснение того, почему комментирование в последней строке кода вызывает ошибку? Я знаю, что этот объект .__ 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) 

ответ

6

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

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

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

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

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