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

标签 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]

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

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

最佳答案

类属性通常比全局属性好,因为它们只是彼此共享,而不是与世界上的每个人共享。

为此,将 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 类或根本没有人应该决定列表的“共享”程度。对于不同的应用程序,答案是不同的,因此很难给出一个抽象示例的答案,如 Amy_list

关于python - 在类实例之间共享列表的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25777339/

相关文章:

被跳过的 C++ 函数

python - 从邻居导入模块但报告语法错误

c++ - 如何从类内部实例化的对象访问私有(private)变量

python - django 管理更改列表中的自定义 list_editable 字段,它不直接对应于模型字段

来自一系列图像的python 16位灰度视频

php - 在 PHP 类中使用外部数组

ios - 如何将观察到的属性传递给其他类?

c# - 在c#中为成员类设置默认值

python - 读取csv文件时如何以时间升序方式获取最近一天的行?

python - 由于 IndexError 导致无法迭代嵌套列表