2016-12-10 4 views
0
class GrandParent(): 
    def __init__(self, a, b): 
     self._a = a 
     self._b = b 

    def blah(self): 
     return "GP:" + self._a + self._b 

class Parent2(GrandParent): 
    def __init__(self, a, b, c): 
     self._a = b 
     self._b = a 
     self._c = self.blah() 

class Child2(Parent2): 
    def __init__(self, a, b, c, d):  
     Parent2.__init__(self, a, b, c) 

    def blah(self): 
     return ("C2: " + self._a + self._b 
     + self._c + self._d) 


c2 = Child2("A", "B", "C", "D") 

Вот код, который я должен отслеживать. Я создаю объект c2 из Child2. Я иду в Child2.__init__. Я иду в Parent2.__init__. I инициализировать self._a, self._b.Python ООП отслеживание небольшой путаницы

Моя проблема с self._c.

Parent2 не метод blah(), поэтому я ожидал бы получить self._c от GrandParent.blah(), но вместо этого он идет к Child2.blah(). Почему это происходит?

+0

В вашем примере 'Child2' должен быть подклассом' Parent2' (в настоящее время он говорит 'Parent1'). Редактирование слишком мало для меня, чтобы исправить это. –

+0

@ P-робот сделан, было сделано несколько других улучшений, которые могли быть сделаны, поэтому редактирование было достаточно большим. –

+0

На самом деле это часть фрагмента кода чего-то большего, но Parent1 не играет никакой роли, и не было таких классов, как Child1, поэтому я удалил их, потому что они не были релевантны моей проблеме –

ответ

1

Потому что self является прямым экземпляром Child2, поэтому self.blah() должен быть эквивалентом Child2.blah(self). То, что код находится в методе родителя Child2 непосредственно перед тем, как этот вызов не подходит.

+0

Ohhhh .... но в случае что Child2 не сказал о бла, тогда он бы назвал родителя? –

+0

Да. Более конкретно, он будет просматривать «Child2 .__ mro__» (порядок разрешения метода) и выбрать первый, который имеет этот метод. –