список экземпляров как атрибут класса - PullRequest
1 голос
/ 15 октября 2019

Является ли хорошей практикой создание атрибута класса (списка), который содержит все экземпляры класса?

Есть ли у него плохие побочные эффекты, о которых мне следует подумать?

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 Ответ

3 голосов
/ 15 октября 2019

Является ли хорошей практикой создание атрибута класса (списка), который содержит все экземпляры класса?

Нет. Хотя такой шаблон может бытьполезно, считают это неожиданным для большинства людей. Используйте его, только если есть явное преимущество и строго документируйте его.

Есть ли у него плохие побочные эффекты, о которых мне следует подумать?

Хотя это не обязательно плохо, различные стороны-эффекты не будут очевидны для пользователей класса.

  • Практически удаляет автоматическую сборку мусора для экземпляров. По крайней мере, Car.cars должен использовать слабые ссылки , чтобы в конечном итоге собирать объекты.

  • Он обеспечивает глобальную область видимости для экземпляров. Если два потока создают автомобили, они разделяют все экземпляры. Нельзя (легко) дооснастить поток или задание локальность.

  • Поведение подклассов не очевидно. Если Truck расширяется Car, содержит ли Car.cars грузовики? Если существует Truck.cars, дублируется ли его содержимое в Car.cars?

  • Использование list экземпляров будет очень медленным во многих случаях. И Car.delete, и Car.by_color растут медленнее с количеством экземпляров. Попробуйте использовать (слабый) набор или словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...