2016-05-26 1 views
1

Я следующий код, где я хочу добиться: Пожалуйста Понимать Я новичок в объектно-ориентированном программировании 1) Инициализировать «класс B» от основной функцииКак получить доступ к переменным из унаследованного класса родителя в python?

2) Наследование «класс А» от «класса B "и в зависимости от некоторых условий переменных класса« класс D »из класса« B »

3) После вызова класса D используйте переменные из« класса A », чтобы изменить их и распечатать это из.

4) После этого вернитесь к классу B, чтобы запустить код для получения дополнительных условий.

`` `

class A(object): 
     def __init__(self): 
      super(A,self).__init__() 
      self.A_var = 0 
      print('Running A.__init__') 
    class B(A): 
     def __init__(self): 
      super(B,self).__init__() 
      #B.__init__(self) 

     def fun2(): 
      self.A_var += 5 
      #foo = D() 
      self.fun1 
      print('Running B.__init__') 
      print self.A_var   

      #A.__init__(self) 


    class D(B,A): 
     def __init__(self): 
      #super(A,grandfather).__init__() 
      #A.__init__(grandfather) 
      super(D,self).__init__() 
      #D.__init__(self) 
     def fun1(): 
      print('Running D.__init__') 
      self.A_var += 400 
      print self.A_var 


    if __name__ == '__main__': 
     b = B() 
     b.fun2 

` ``

Я хочу, чтобы распечатать значение "self.A_var" изнутри "класса D"

+0

Что вы хотите сказать? – barny

+0

@barny Я хочу, чтобы он распечатывал «self.A_var», но он не дает мне требуемого результата, вместо этого он выводит «Запуск A .__ init__» в качестве вывода. –

ответ

0

Вы не поняли, что наследование. Примером D является экземпляр A и B, потому что он наследует их. Единственное, что вам нужно сделать, это убедиться, что вы вызываете super() в каждом методе __init__; по какой-то причине вы заменили ту, что в D, с совершенно неправильным D.__init__, который будет бесконечно рекурсивно. Верните super(D,self).__init__().

Единственное другое изменение заключается в удалении бессмысленного экземпляра D в B.fun2; просто позвоните self.fun1() там.

+0

Я до сих пор не получаю требуемый вывод вывода «self.A_var», как я могу это сделать, вместо этого я просто запускаю запуск .__ init__ в качестве outpur, ответьте. спасибо за понимание, я новичок в ООП в python. –

0

, если вы хотите распечатать значение «self.A_var» изнутри «класс D» , чем выполнить: d.fun1() контроля этого модифицированного код:

class A(object): 
    def __init__(self): 
     super(A, self).__init__() 
     self.A_var = 0 
     print('Running A.__init__') 


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

    def fun2(self): 
     self.A_var += 5 
     print ('Running B.__init__'), self.A_var 


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

    def fun1(self): 
     self.A_var += 400 
     print ('Running D.__init__'), self.A_var 


if __name__ == '__main__': 
    d = D() 
    d.fun2() 
    d.fun1() 

с этим выходным кодом

Running A.__init__ 
Running B.__init__ 5 
Running D.__init__ 405 
+0

Можете ли вы также рассказать, как я могу назвать «класс D» из «класса B» i.e изнутри «fun2» в зависимости от состояния. Спасибо за ответ тоже. –

+0

@RishabhGupta, пожалуйста, позвольте мне очистить ваше состояние от того, что именно вы хотите сделать после вызова класса D в функции fun2 класса B. и если вы вызываете класс D в классе B, чем вы получите - RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python –

+0

По мне это должен быть поток программы: 1) Основная программа должна вызывать «класс B », который должен наследовать« класс А »и все его атрибуты/переменные. 2) В зависимости от состояния переменной «класс А» «класс B» должен называть «класс D», который должен иметь все переменные «класс A» и «класс B» 3) После этого код должен вернуться к «классу B», чтобы я мог проверить дополнительные условия, чтобы называть подобные классы «классом D» изнутри «класса B» Спасибо, что помогли мне. –