gpt4 book ai didi

python - 作为类属性的实例列表

转载 作者:太空宇宙 更新时间:2023-11-04 11:10:24 25 4
gpt4 key购买 nike

创建一个包含类的所有实例的类属性(列表)是一种好的做法吗?

它是否有我应该考虑的不良副作用?

class Car:
cars = []
def __init__(self, color):
self.color = color
__class__.cars.append(self)

def delete(self):
__class__.cars.remove(self)

@classmethod
def by_color(cls, color):
for car in cls.cars:
if car.color == color:
return car

def __repr__(self):
return str(self)

def __str__(self):
return '{} Car'.format(self.color)


car1 = Car('green')
car2 = Car('blue')
car3 = Car('red')

print(Car.cars) # [green Car, blue Car, red Car]

car3.delete()
print(Car.cars) # [green Car, blue Car]

最佳答案

Is it a good practice to create a class attribute (list) that contains all instances of a class?

否。虽然这种模式可能很有用,但对于大多数人来说,它是出乎意料的。仅在有明显好处时才使用它并严格记录。

Does it have bad sideffects that i should think about?

虽然不一定是坏事,但各种副作用对类(class)的用户来说并不明显。

  • 它实际上移除了实例的自动垃圾收集。至少,Car.cars 应该使用 weak references以允许最终收集对象。

  • 它为实例强制执行全局范围。如果两个线程创建汽车,它们将共享所有实例。不可能(容易)改造 threadtask地点。

  • 子类下的行为不明显。如果 Truck 扩展 CarCar.cars 是否包含卡车?如果 Truck.cars 存在,它的内容是否也在 Car.cars 中重复?

  • 使用实例的 list 对于许多实例来说会非常慢。 Car.deleteCar.by_color 都随着实例数量的增加而变慢。考虑使用(弱)集或字典。

关于python - 作为类属性的实例列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58396380/

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