实例列表作为类属性

时间:2019-10-15 13:54:56

标签: python oop

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

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

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]

1 个答案:

答案 0 :(得分:3)

  

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

否。尽管这种模式很有用,但对于大多数人来说,这是出乎意料的。仅在有明显好处的情况下使用它,并严格记录在案。

  

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

虽然不一定很糟,但对于班级用户来说,各种副作用并不明显。

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

  • 它强制实例的全局作用域。如果两个线程创建汽车,则它们共享所有实例。无法(容易)改造threadtask的位置。

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

  • 在许多实例中使用list实例将非常慢。 Car.deleteCar.by_color随实例数量的增长而变慢。考虑使用(弱)集或字典。