我有以下代码。父类有一个项目列表,孩子们需要添加到这些项目中。
父母的每个实例都需要有这个列表,每个孩子都需要拥有该列表+额外的值。
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', ]
答案 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']