首页 > 解决方案 > 作为类属性的实例列表

问题描述

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

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

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]

标签: pythonoop

解决方案


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

不会。虽然这样的模式很有用,但认为它对大多数人来说是意料之外的。仅在有明显好处并严格记录时才使用它。

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

虽然不一定是坏事,但对课程的用户来说,各种副作用不会很明显。

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

  • 它强制执行实例的全局范围。如果两个线程创建汽车,它们共享所有实例。改造线程任务位置不是(容易)可能的。

  • 子类化下的行为并不明显。如果Truck延长Car,是否Car.cars包含卡车?如果Truck.cars存在,它的内容是否也被复制了Car.cars

  • 对于许多实例,使用一个list实例将非常慢。两者都随着实例数量的增长而变慢Car.deleteCar.by_color考虑使用(弱)集合或字典。


推荐阅读