如何从父类扩展列表?

时间:2014-10-17 13:30:52

标签: python list inheritance superclass

我有以下代码。父类有一个项目列表,孩子们需要添加到这些项目中。

父母的每个实例都需要有这个列表,每个孩子都需要拥有该列表+额外的值。

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', ]

4 个答案:

答案 0 :(得分: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']

或者,您可以复制父类&#39;列表:

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

答案 1 :(得分: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', ]的全新列表。

答案 2 :(得分:0)

我解决了,解决方案非常简单和干净。不需要super或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']

答案 3 :(得分:0)

您可以使用元类来获取更新的列表作为类属性,而不必在使用它的每个类中编写相同的代码。我不确定在没有元类的情况下是否可以实现同样的功能,如果可以,请告诉我。

class A(type):                                                
    foo = ['a']
                                                              
    def __new__(self, name, classes, dct):                    
        foo = dct.get('foo')
        if foo:                                               
            dct['foo'] = self.foo + foo                       
        return type.__new__(self, name, classes, dct)                                    
                                                              
                                                              
class B(metaclass=A):                                         
    foo = ['b']      

A.foo 
# >> ['a']
B.foo 
# >> ['a', 'b']