2015-09-16 2 views
0

меня такая ситуацияPython Множественное наследование Пример

class A(object): 

    def __init__(self): 
     self.x = 0 
     self.y = 0 

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

    def method(self): 
     self.x += 1 

class C(A): 

    def __init__(self): 
     super(C, self).__init__() 

    def method(self): 
     self.y += 1 

class D(B, C): 

    def __init__(self): 
     super(D, self).__init__() 

    def method(self): 
     print self.x 
     print self.y 

Я хочу, чтобы напечатать D 1 для обоих х и у, но печать 0.
Я не в полной мере понять множественное наследование/супер/и т.д. ... и пока я пытался прочитать документы, объяснение на этом примере было бы очень полезно для меня.

Спасибо!

ответ

1

Когда вы создаете объект D, он никогда не вызовет метод с именем «метод». Он просто вызовет метод родителя 'init'. Таким образом, x или y не изменится.

+0

глупый, я понимаю, спасибо! – Lemonio

2

Если вы применяете метод method в своем примере, но все же хотите получить поведение как базового, так и собственного, вам необходимо использовать super, чтобы вызвать версию метода, который вы переопределяете.

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

    def method(self): # we need a verion of method() to end the super() calls at 
     pass 

class B(A): 
    def method(self): 
     super(B, self).method() # call overridden version of method() 
     self.x += 1 

class C(A): 
    def method(self): 
     super(C, self).method() # here too 
     self.y += 1 

class D(B, C): 
    def method(self): 
     super(D, self).method() # and here 
     print self.x 
     print self.y 

Я удалил ненужные __init__ методы в ваших дочерних классах. Нет необходимости переопределять метод, если вы не меняете его поведение, и ни один из более поздних методов __init__ не сделал ничего, кроме вызова своего предшественника.

 Смежные вопросы

  • Нет связанных вопросов^_^