2014-10-17 69 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