2014-10-17 93 views
3

我有以下代碼。父類有一個項目列表,孩子需要添加。如何從父類中擴展列表?

父母的每一個實例都需要擁有這個列表,每個孩子都需要擁有那個列表+額外的值。

class Parent(object): 
    a_list = ['parent_item1', 'parent_item2', ] 

    def print_list(self): 
     print(self.a_list) 


class Child1(Parent): 
    def __init__(self, *args, **kwargs): 
     super(Child1, self).__init__(*args, **kwargs) 
     self.a_list += ['child1_item'] 


class Child2(Parent): 
    def __init__(self, *args, **kwargs): 
     super(Child2, self).__init__(*args, **kwargs) 
     self.a_list += ['child2_item'] 


parent = Parent() 
child1 = Child1() 
child2 = Child2() 

parent.print_list() 
    # >> ['parent_item1', 'parent_item2', 'child1_item', 'child2_item'] 
child1.print_list() 
    # >> ['parent_item1', 'parent_item2', 'child1_item', 'child2_item'] 
child2.print_list() 
    # >> ['parent_item1', 'parent_item2', 'child1_item', 'child2_item'] 

我怎樣才能得到以下結果?

['parent_item1', 'parent_item2', ] 
['parent_item1', 'parent_item2', 'child1_item', ] 
['parent_item1', 'parent_item2', 'child2_item', ] 

回答

3

list += other_list擴展列表就地。使用+運算符,它返回一個新的列表:

class Parent(object): 
    a_list = ['parent_item1', 'parent_item2', ] 
    def print_list(self): 
     print(self.a_list) 

class Child1(Parent): 
    def __init__(self, *args, **kwargs): 
     super(Child1, self).__init__(*args, **kwargs) 
     self.a_list = self.a_list + ['child1_item'] # <------- 

class Child2(Parent): 
    def __init__(self, *args, **kwargs): 
     super(Child2, self).__init__(*args, **kwargs) 
     self.a_list = self.a_list + ['child2_item'] # <------- 


parent = Parent() 
child1 = Child1() 
child2 = Child2() 
parent.print_list() 
child1.print_list() 
child2.print_list() 

輸出:

['parent_item1', 'parent_item2'] 
['parent_item1', 'parent_item2', 'child1_item'] 
['parent_item1', 'parent_item2', 'child2_item'] 

或者,你可以讓父類的副本名單:

... 
self.a_list = self.a_list[:] 
self.a_list += ['child1_item'] 
0

你想要有一個Parent的構造函數。問題是他們都共享同一個列表,當Parent被聲明時會被創建。相反,你想:

class Parent(object): 
    def __init__(self): 
     self.a_list = ['parent_item1', 'parent_item2', ] 
    def print_list(self): 
     print(self.a_list) 

這樣,當你構建一個家長,你創建一個包含['parent_item1', 'parent_item2', ]一個全新的列表。

0

我解決了它,解決方案非常簡單,乾淨。不需要超級或init()

class Parent(object): 
    a_list = ['parent_item1', 'parent_item2', ] 

    def print_list(self): 
     print(self.a_list) 


class Child1(Parent): 
    a_list = Parent.a_list + ['child1_item', ] 


class Child2(Parent): 
    a_list = Parent.a_list + ['child2_item', ] 


parent = Parent() 
child1 = Child1() 
child2 = Child2() 

parent.print_list() 
    # >> ['parent_item1', 'parent_item2', ] 
child1.print_list() 
    # >> ['parent_item1', 'parent_item2', 'child1_item', ] 
child2.print_list() 
    # >> ['parent_item1', 'parent_item2', 'child2_item'] 
+1

不錯。我不同意'超'不是'簡單和乾淨',雖然。 'super'方法被設計用來取代通過名稱顯式引用父類。這樣,如果更改當前類的繼承樹,'super'會自動解決任何參考問題。 – 2014-10-17 13:59:29