创建包含类的所有实例的类属性(列表)是一种好习惯吗?
我应该考虑它是否有不良副作用?
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]
答案 0 :(得分:3)
创建包含类的所有实例的类属性(列表)是一种好习惯吗?
否。尽管这种模式很有用,但对于大多数人来说,这是出乎意料的。仅在有明显好处的情况下使用它,并严格记录在案。
我应该考虑它是否有不良副作用?
虽然不一定很糟,但对于班级用户来说,各种副作用并不明显。
它实际上删除了实例的自动垃圾收集。至少,Car.cars
应该使用weak references来最终收集对象。
子类下的行为并不明显。如果Truck
扩展了Car
,Car.cars
是否包含卡车?如果存在Truck.cars
,其内容也会在Car.cars
中重复吗?
在许多实例中使用list
实例将非常慢。 Car.delete
和Car.by_color
随实例数量的增长而变慢。考虑使用(弱)集或字典。