2017-01-08 2 views
-1

У меня есть вопрос о программе:конструктор с или без себя?

class A: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def to_string(self): 
     return "x, y = (" + str(self.x) + ", " + str(self.y) + ")" 

    def __str__(self): 
     return self.to_string() 


class B(A): 
    def __init__(self, z, *args): 
     A.__init__(self, *args) 
     self.z = z 

    def __str__(self): 
     return super().__str__() 


class C(A): 
    def __init__(self, *args): 
     super().__init__(*args) 

    def to_string(self): 
     return "Klasse C, " + super().to_string() 

Почему я должен написать

A.__init__(self, *args) 

вместо

A.__init__(*args) 

В классе С он работает? Много приветствий

+0

Исправьте отступа при объявлении класса B и C –

+1

Обратите внимание, что конструкторы '' b' и C' не то же самое. Они используют разные методы для вызова базового конструктора. –

ответ

4

Вы получаете доступ к несвязанному методу, так self не прошли. Там нет контекста для A.__init__ знать, что экземпляр для связывания.

У вас есть несколько вариантов, чтобы обеспечить этот контекст:

  • Pass в self в явном виде, как вы это делали.
  • Привязка вручную, с A.__init__.__get__(self)(*args)
  • В Python 3 используйте super().__init__(*args), и затем контекст берется из текущего метода. См Why is Python 3.x's super() magic?
Смежные вопросы