2017-10-10 73 views
0

我無法理解繼承中實例變量的邏輯。 這是我(簡化)代碼註釋解釋我是如何理解它的行爲:在派生類中訪問已更改的基類實例屬性

class Main(object): 

    def __init__(self): 
     self.p = Parent() # self.parameter = [] 
     self.c = Child() # self.parameter = [] 

    def run(self): 
     self.p.setting() # assigning value to self.parameter 
     self.c.getting() 


class Parent(object): 

    def __init__(self): 
     self.parameter = [] 

    def setting(self): 
     self.parameter = [1, 2, 3] 


class Child(Parent): 
    # not redefining __init__, so Parent __init__ is called 

    def getting(self): 
     # value was assigned to self.parameter in setting method, 
     # called before getting 
     print self.parameter 


Main().run() 

getting打印[],而不是[1, 2, 3]我的預期。爲什麼這樣?由於Child__init__Parent,在開始self.parameter = []兩者,但爲什麼它仍然是[]時,它被分配一個值很長的Child().__init__被稱爲?我應該怎麼做才能在getting中更改self.parameter值?

+0

Python是不是Java;不是每件事都必須是一個階級。擺脫'Main'。 – chepner

回答

1

讓我們來執行您的代碼。

  1. main實例使用Main()創建。

在這個時刻,我們有main.p = []main.s = [],如Main.__init__

定義
  • main.run()被調用,它調用main.p.setting()main.c.getting()
  • 所以現在,main.p.setting()將的parameter值更改爲[1,2,3],而main.c.setting()僅打印其自身的parameter值e,它仍然是[],因爲它從未被修改過。

    如果要修改main.c.parameter值,只需撥打main.c.setting()

    main = Main() 
    main.c.setting() 
    main.run() 
    
    0

    您不是繼承Main中的任何內容,而是添加成員變量。你表達的是「有」的關係,而不是「是」。

    要繼承,定義Main這樣:

    class Main(Child): 
    
        def run(self): 
         self.setting() 
         self.getting() 
    

    以您目前的代碼,你可以調用main_instance.run()後檢查main_instance.p.parameter,看到返回[1, 2, 3]

    相關問題