Каждый раз, когда мы создаем новый класс, Python сохраняет каждый атрибут в атрибуте dict, который называется динамическим словарем. Такое поведение по умолчанию кажется удобным, поскольку оно гибкое, но когда вы работаете с большим количеством экземпляров или использование памяти имеет большое значение, эти накладные расходы могут быть значительными.
Python в основном использует словарь для хранения атрибутов класса, но одной из альтернатив является использование слотов. Определяя это имя, мы говорим Python использовать более статическую и компактную структуру, что значительно снижает использование памяти. Вот базовый пример использования слотов в классе.
import sys class WithoutSlots: def __init__(self, x, y): self.x = x self.y = y class WithSlots: __slots__ = ['x', 'y'] def __init__(self, x, y): self.x = x self.y = y obj1 = WithoutSlots(1, 2) obj2 = WithSlots(1, 2) print(sys.getsizeof(obj1.__dict__)) # 296 print(sys.getsizeof(obj2)) # 48
Как показано выше, «WithoutSlots» использует гораздо больше памяти по сравнению с «WithSlots». Подумайте о создании множества экземпляров класса. Какой подход будет лучшим выбором?
слоты может быть полезным инструментом, но имеет ограничения:
obj = WithSlots(1, 2) obj.z = 3 # This will raise an AttributeError
Мы можем обойти эту проблему, добавив dict в слот .
Нет множественного наследования: каждый базовый класс должен содержать определенные слоты, иначе Python вернется к использованию словаря для хранения атрибутов экземпляра.
Нет значения по умолчанию: вам необходимо явно инициализировать значения по умолчанию в методе init.
Я записал несколько лучших примеров сценариев, в которых мы можем использовать слоты:
Вот как в Python используются слоты: вы можете использовать их, если уверены, что для вашего класса не потребуются никакие другие атрибуты и вы работаете с ними. большое количество экземпляров. Определяя slots, вы указываете Python использовать более эффективную и компактную структуру для хранения атрибутов, что помогает экономить память. Это особенно удобно, когда использование памяти является проблемой или когда вам нужно оптимизировать производительность. Просто помните, что с помощью slots вы не можете добавлять новые атрибуты динамически, поэтому его лучше всего использовать, когда атрибуты вашего класса фиксированы и четко определены.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3