gpt4 book ai didi

python - 收集类变量中的所有实例总是不好的吗?

转载 作者:太空狗 更新时间:2023-10-29 22:21:59 25 4
gpt4 key购买 nike

考虑存储云位置的简单天气模型的两个版本:

class cloud:
def __init__(self, x, y):
self.x = x
self.y = y

collection = []
collection.append(cloud(1,2))
collection.append(cloud(4,6))

def update_all_clouds(collection):
for c in collection:
cloud.x += 1
cloud.y += 1

update_all_clouds(collection)

对比

class cloud:
collection = []
def __init__(self, x, y)
self.x = x
self.y = y
cloud.collection.append(self)
@classmethod
def update_all(cls):
for c in cloud.collection:
c.x += 1
c.y += 1
cloud(1,2)
cloud(4,6)
cloud.update_all()

这里基本已经被惩罚了 Is it bad to store all instances of a class in a class field?但是这里强调作用于所有实例的类方法。第二种方法提供的最后三行的简单性没有什么可说的吗?

我知道另一种方法是创建一个类似于列表的类,例如 collection 并为该类提供 update_all() 之类的方法,但对我来说它似乎并没有好多少。

最佳答案

一般来说,这是不好的,是的,原因很简单,列表中的对象几乎永远保留对它们的引用。有一个对象的引用可以防止它被垃圾收集。所以你的类型的对象基本上永远存在(直到程序终止)并且它们占用的内存永远不会被释放。

当然,如果您对此有非常具体的需求,并且可以完全控制对象的创建时间,您可以那样做。但总的来说explicit is better than implicit , 所以最好有一个实际的集合来添加这些元素。该集合甚至可以存在于该类型中,因此您可以:

obj = Cloud(…)
Cloud.add(obj)

# or even
obj = Cloud(…).persistInType()

你也可以使用 weak references以避免上述问题,但这是额外的开销,并且管理起来有点复杂。所以帮自己一个忙,手动收集对象。

关于python - 收集类变量中的所有实例总是不好的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31309588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com