在类实例之间共享列表的正确方法是什么?

时间:2014-09-11 00:51:35

标签: python class

我有这个示例代码

my_list = ["a","b","c","d"]

class A:
    def __repr__(self):
        return ', '.join(my_list)

    def add(self, num):
        my_list.append(num)



class_list = []
for x in range(5):
    class_list.append(A())
    class_list[x].add("class_%s" % (x))
    print class_list[x]

我的非示例代码更复杂,但我的想法是我有多个类的实例关闭#34;事情"。所有实例都使用全局my_list。当在类中满足某些逻辑时,该实例将修改列表。其余的类也将利用该列表来执行它们的逻辑。任何实例都可以添加到列表中,并且所有实例都应该能够使用更新的值。

现在在这个例子中,my_list是共享的,但这是正确的方法吗?

1 个答案:

答案 0 :(得分:4)

一个类属性通常比一个全局更好,因为他们只是相互分享,而不是与世界上的每个人分享。

为此,请移动my_list = ["a","b","c","d"]下的class A:行,并将每个对my_list的引用更改为self.my_listA.my_list

class A(object):
    shared_list = []
    def add(self, num):
        self.my_list.append(num)

但是,实例属性通常甚至更好。如果将相同的列表分配给一堆不同的变量,它仍然只是一个列表;改变它会影响所有这些变量。所以,你可以这样做:

class A(object):
    def __init__(self, shared_list):
        self.shared_list = shared_list
    def add(self, num):
        self.shared_list.append(num)

现在,由使用A对象的代码决定是否为它们提供相同的列表。您甚至可以创建共享一个列表的20个实例,以及共享不同列表的10个实例:

list1 = []
group1 = [A(list1) for _ in range(20)
list2 = []
group2 = [A(list2) for _ in range(10)

问题在于呼叫者,A类,或者根本没有人应该决定如何共享"#34;清单是。对于不同的应用程序,答案是不同的,因此很难为具有Amy_list等名称的抽象示例给出答案。