我有这个示例代码
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
是共享的,但这是正确的方法吗?
答案 0 :(得分:4)
一个类属性通常比一个全局更好,因为他们只是相互分享,而不是与世界上的每个人分享。
为此,请移动my_list = ["a","b","c","d"]
下的class A:
行,并将每个对my_list
的引用更改为self.my_list
或A.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;清单是。对于不同的应用程序,答案是不同的,因此很难为具有A
和my_list
等名称的抽象示例给出答案。