Серия «Шпаргалки»

6

Использование array.array в Python: когда и зачем применять

array.array — это специализированный тип данных в Python, предназначенный для хранения последовательностей однотипных чисел. В отличие от list, массивы array.array обеспечивают более эффективное использование памяти и повышенную производительность при работе с числовыми данными.

🔹 В каких случаях полязно использовать array.array

1. Для работы с большими массивами чисел

При обработке больших объёмов числовых данных array.array позволяет значительно экономить память, поскольку хранит элементы в компактном виде. В отличие от list, который использует объекты Python для хранения значений, array.array использует непрерывный блок памяти, в котором числа хранятся в виде простых байтовых последовательностей. Это уменьшает накладные расходы, связанные с управлением объектами Python, и ускоряет доступ к элементам.

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

Пример сравнения памяти между array.array и list:

2. Когда необходима высокая производительность

Чтение, запись и операции над array.array работают быстрее, чем над list, поскольку массив использует фиксированное представление элементов в памяти.

3. Для передачи данных в C-библиотеки

Если требуется передавать массив данных в C или взаимодействовать с ctypes и struct, array.array значительно упрощает задачу. Массив array.array хранит данные в компактном виде, что делает его удобным для передачи в нативные C-функции и API, которые ожидают последовательности чисел в виде непрерывного блока памяти.

Пример использования с ctypes:

Использование array.array позволяет избежать дополнительных преобразований типов данных и копирования памяти, что особенно важно при работе с высокопроизводительными вычислениями и библиотеками на C.

Пример использования с struct, который помогает кодировать и декодировать бинарные данные:

4. Для обмена бинарными данными

Если необходимо хранить и передавать числовые данные в компактном бинарном формате, array.array предоставляет удобные методы tobytes() и frombytes(). Эти методы позволяют легко конвертировать массив в последовательность байтов и обратно без необходимости дополнительных преобразований, как это требуется для списков.

Пример сохранения и восстановления массива из бинарных данных:

Этот механизм полезен при работе с файлами, сетевыми протоколами или бинарными форматами данных, где требуется передача числовых массивов в сжатом и эффективном виде.

5. Для работы с фиксированными структурами данных

Если заранее известно, что требуется хранить только один тип данных, использование array.array гарантирует отсутствие ошибок, связанных с разнородными элементами.

6. Для хранения данных в бинарных файлах

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

🔹 Сравнение array.array и list

Удачи!

Показать полностью 8
8

Планировщик задач Windows: Автоматизируем рутину

  • Что такое Планировщик задач?

Планировщик задач (Task Scheduler) - системная служба Windows, которая позволяет создавать и управлять автоматизированными задачами. Задачи могут быть настроены для запуска в определенное время, при определенных событиях (например, при входе пользователя в систему) или при соблюдении определенных условий.

Как открыть Планировщик задач?

Есть несколько способов:

  • Через поиск Windows: Введите "Планировщик задач" в поле поиска на панели задач и выберите соответствующий результат.

  • Через команду "Выполнить": Нажмите Win + R, введите taskschd.msc и нажмите Enter.

  • Через панель управления: Откройте панель управления, выберите "Система и безопасность", а затем "Администрирование" и "Планировщик заданий".

Создание задачи: пошаговая инструкция

- Открыть Планировщик задач: (см. выше).

Создать задачу:

В левой панели выберите "Библиотека планировщика заданий". В правой панели нажмите "Создать простую задачу..." или "Создать задачу...".

  • Простая задача: Помогает быстро настроить основные параметры задачи, такие как имя, описание, расписание и действие.

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

Заполнить параметры задачи:

  • Имя и описание: Укажите понятное имя и описание, чтобы легко идентифицировать задачу в будущем.

  • Триггеры: Определите, когда задача должна запускаться. Это может быть расписание (ежедневно, еженедельно, ежемесячно), событие (при входе пользователя в систему, при запуске компьютера) или условие (при простое системы).

  • Действия: Укажите, что должна делать задача. Чаще всего это запуск программы или скрипта, но также можно отправить электронное письмо или отобразить сообщение.

  • Условия: Укажите дополнительные условия, при которых задача должна запускаться (например, только при питании от сети).

  • Параметры: Настройте дополнительные параметры, такие как время выполнения, поведение при ошибках и т. д. Например:

    • "Запустить задачу как можно скорее после пропущенного запланированного запуска": Гарантирует, что задача будет выполнена, даже если компьютер был выключен во время запланированного запуска.

    • "Остановить задачу, если она выполняется дольше": Предотвращает зависание задач и перегрузку системы.

  1. Нажать "ОК": После настройки всех параметров нажмите "ОК", чтобы сохранить задачу.

Полезные примеры использования

Автоматическое резервное копирование файлов

Создадим задачу, которая будет ежедневно или еженедельно выполнять резервное копирование важных файлов на внешний жесткий диск или в облачное хранилище. Напишем простой скрипт на PowerShell и python.

python

powershell

Удачи!

Показать полностью 13
9

Управление мышью в Python

Содержание:

* Симуляция щелчков мышью.

* Получение позиции мыши.

* Перетаскивание мышью.

* Перемещение мыши.

* Создание обратных вызовов на события мыши.

* Прокрутка вверх и вниз.

* Запись событий мыши и их воспроизведение.

* Игрушечный проект рисования.


Имитировать щелчки мышью:

Получить позиции мыши:

При вызове этой функции она возвращает кортеж, содержащий два элемента: x-координату и y-координату положения курсора. Эти координаты обычно представлены в пикселях. Верхний левый угол экрана считается началом координат (0, 0). Координата `x` увеличивается при движении вправо, а координата `y` увеличивается при движении вниз. Приведенный выше вывод означает, что курсор мыши находится на расстоянии 646 пикселей справа от левого края основного экрана и на 407 пикселей вниз от верхнего края экрана.
Если у вас несколько экранов, вы можете получить отрицательные значения или значения, превышающие разрешение основного экрана. Это происходит потому, что операционная система рассматривает весь набор экранов как одну большую область отображения.

Перетаскивание мышью:

Установка `absolute` равным `False` при начальных позициях (0, 0) означает, что перетаскивание будет происходить из текущей позиции на 100 дальше (по x и y).

Перемещение мыши:

Этот код переместит мышь относительно в течение 0,2 секунды. Разберем, что означает каждый параметр в этом вызове функции:
* `(100, 100)`: это x- и y-координаты, к которым вы хотите переместить курсор мыши. В этом случае оба установлены в 100.
* `absolute=False`: этот параметр определяет характер перемещения. Когда `absolute` установлено в `False`, перемещение является относительным. Это означает, что курсор переместится на 100 пикселей вправо (координата x) и на 100 пикселей вниз (координата y) от своего текущего положения. Если бы `absolute` было установлено в `True`, курсор переместился бы в абсолютную позицию (100, 100) на экране, где (0, 0) обычно является верхним левым углом экрана.
`duration=0.2`: этот параметр указывает продолжительность перемещения в секундах. Он установлен на 0,2, что означает, что курсору потребуется 0,2 секунды для завершения перемещения. Это создает плавное, анимированное движение курсора, а не мгновенный скачок. Если бы продолжительность была установлена на 0, перемещение было бы немедленным.

Создание обратных вызовов на события мыши:

Вы можете создавать обратные вызовы, которые вызываются при возникновении события, такого как щелчок мыши. Приведенный выше код создает простые обратные вызовы при каждом щелчке кнопок мыши; здесь мы просто использовали лямбда-функции для демонстрации; вы можете использовать любую функцию. Приведенный выше код создает простые обратные вызовы при каждом щелчке кнопок мыши; здесь используется лямбда-функции для демонстрации. Вы можете использовать любую функцию. Если вы хотите удалить слушателей, вы можете вызвать `unhook_all()`,

Прокрутка вверх и вниз:

Функция `mouse.wheel()` имитирует прокрутку колеса мыши вниз или вверх. Отрицательное значение, такое как -1, указывает на прокрутку вниз на один шаг, а положительное значение, такое как `mouse.wheel(5)`, будет указывать на прокрутку вверх на 5 шагов.

Запись событий мыши и их воспроизведение:

Это запишет все события мыши до тех пор, пока не будет нажата правая кнопка. Затем он возвращает список записанных событий:

Игрушечный проект, который рисует квадрат и круг

Не забудьте открыть программу для рисования, такую как Paint, поместить туда мышь и выполнить код и он нарисует квадрат, а затем круг.

Удачи!

Показать полностью 9
8

101 игра на python. Шпаргалки. Списковые включения (list comprehensions)

Что такое списковое включение?

В самом простом виде, списковое включение – это компактный способ создания нового списка на основе уже существующего (или любого итерируемого объекта). Вместо того, чтобы использовать традиционный цикл for и добавлять элементы в список по одному, ты можешь сделать это в одну строку кода.

  • Краткость: Они позволяют писать меньше кода.

  • Читаемость: Когда ты привыкнешь к их синтаксису, ты будешь находить их более легкими для понимания, чем эквивалентные циклы for.

  • Производительность: В некоторых случаях списковые включения могут быть быстрее, чем циклы for.

Вот базовый синтаксис спискового включения:

  • expression: Выражение, которое определяет, как будет вычисляться каждый элемент нового списка. Это может быть что угодно: простое значение, математическая операция, вызов функции.

  • item: Переменная, которая принимает значение каждого элемента из iterable по очереди.

  • iterable: Итерируемый объект, например, список, кортеж, строка или результат работы range().

Пример:

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

Без спискового включения:

Со списковым включением:

Списковое включение делает код короче и понятнее!

Добавление условия

Списковые включения также позволяют тебе добавлять условия для выбора элементов, которые будут включены в новый список.

  • condition: условие, которое должно выполняться для включения элемента в новый список.

Пример:

Создадим список квадратов только четных чисел из нашего исходного списка numbers.

Без спискового включения:

Со списковым включением:

Я добавил if number % 2 == 0 в списковое включение, чтобы отфильтровать только четные числа.

Многострочные списковые включения

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

Пример:

Это делает код более понятным, особенно когда у тебя есть длинные условия или сложные выражения.


Упражнения


Упражнение 1: Преобразование температур

У тебя есть список температур в градусах Цельсия, и тебе нужно преобразовать их в градусы Фаренгейта. Формула для преобразования: F = (C * 9/5) + 32.

Вот твой список температур в Цельсиях:

Задача:

  1. Используя списковое включение, создай новый список fahrenheit_temperatures, содержащий температуры из celsius_temperatures, преобразованные в градусы Фаренгейта.

  2. Выведи полученный список fahrenheit_temperatures на экран.

Подсказка:

  • Используй формулу (celsius * 9/5) + 32 в качестве выражения в списковом включении.

  • Подумай, что является iterable, а что item в данном случае.


Мое решение:

Разбор кода:

  1. celsius_temperatures = [0, 10, 20, 30, 40]: Это исходный список с температурами в градусах Цельсия.

  2. fahrenheit_temperatures = [...]: Здесь мы создаем новый список с помощью спискового включения.

  3. (celsius * 9/5) + 32: Это выражение, которое выполняется для каждого элемента. Оно преобразует температуру из Цельсия в Фаренгейт.

  4. for celsius in celsius_temperatures: Это часть спискового включения, которая перебирает каждый элемент в списке celsius_temperatures, присваивая его значение переменной celsius на каждой итерации.

  5. print(fahrenheit_temperatures): Выводит полученный список температур в Фаренгейтах.

Важно отметить:

  • В данном случае, celsius_temperatures является iterable, а celsius — item.

  • Я использую многострочное форматирование спискового включения для повышения читаемости кода.

  • Внутри выражения я напрямую применяю формулу преобразования, используя текущее значение celsius.


Упражнение 2: Фильтрация и преобразование строк

У тебя есть список слов, и тебе нужно сделать следующее:

  1. Отфильтровать слова, которые начинаются с буквы "a" (регистр не важен).

  2. Преобразовать все оставшиеся слова в верхний регистр.

Вот твой список слов:

Задача:

  1. Используя списковое включение, создай новый список transformed_words, содержащий только те слова из списка words, которые не начинаются с буквы "a" (или "A"), и при этом преобразованные в верхний регистр.

  2. Выведи полученный список transformed_words на экран.

Подсказки:

  • Используй метод строки startswith() для проверки, начинается ли слово с определенной буквы. Не забудь про регистр! Приведи все к нижнему регистру.

  • Используй метод строки upper() для преобразования строки в верхний регистр.

  • Подумай о порядке операций. Сначала фильтруем, потом преобразуем.

    Мое решение:


Упражнение 3: Создание словаря из списка кортежей

У тебя есть список кортежей, где каждый кортеж содержит два элемента: имя и возраст человека.

Задача:

  1. Используя списковое включение, создай словарь people_dict, где ключами будут имена людей, а значениями — их возраст.

  2. Выведи словарь people_dict на экран.

Подсказки:

  • Списковые включения создают списки, но их можно использовать для создания списков кортежей, которые затем можно передать в конструктор dict().

  • Подумай, как извлечь имя и возраст из каждого кортежа.

  • Помни, что словарь — это структура данных, которая хранит пары ключ-значение.

Немного объяснения:

В Python можно создать словарь из списка кортежей, где каждый кортеж состоит из двух элементов (ключ, значение). Для этого я использую конструктор dict(). Например:

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


Мое решение:

Разбор кода:

  1. people_data = [...]: Это исходный список кортежей, где каждый кортеж содержит имя и возраст человека.

  2. people_dict = dict(...): Мы используем конструктор dict(), чтобы создать словарь из списка кортежей.

  3. [ (name, age) for name, age in people_data ]: Это списковое включение, которое создает список кортежей.

    • (name, age): Это выражение создает кортеж из двух элементов: name и age.

    • for name, age in people_data: Это часть перебирает все кортежи из списка people_data. На каждой итерации кортеж распаковывается на две переменные: name и age.

  4. print(people_dict): Выводит созданный словарь.

Ключевые моменты:

  • Списковое включение создает список кортежей.

  • Конструктор dict() преобразует список кортежей в словарь, используя первый элемент кортежа в качестве ключа, а второй - в качестве значения.

  • Распаковка кортежей в цикле for name, age in people_data делает код более читабельным.

  • Списковое включение в этом примере используется для подготовки данных для словаря.

GIT


Другие шпаргалки:


Структуры данныx python
Переменные
Строки
Функции

Когда использовать dict и list
dict vs SimpleNamespace
Синглтон (Singleton)
dataclass

Показать полностью 15
8

101 игра на python. Шпаргалки. Dataclass

Что такое dataclass?

dataclass — это декоратор, введенный в Python 3.7, который автоматически генерирует специальные методы (такие как __init__, __repr__, __eq__ и другие) для классов, которые в основном служат контейнерами для данных. Это избавляет от необходимости писать много шаблонного кода.

Использование dataclass в Python значительно упрощает работу с классами, предназначенными для хранения данных. Вместо того чтобы вручную определять методы __init__, __repr__, __eq__ и другие, достаточно просто объявить поля данных, а dataclass автоматически сгенерирует необходимый код. Это не только делает классы более лаконичными и понятными, но и улучшает читаемость кода, так как акцент смещается на данные, а не на техническую реализацию. Кроме того, автоматически сгенерированный код снижает вероятность ошибок, которые могут возникнуть при ручном написании.

Как использовать dataclass?

Для начала, тебе нужно импортировать декоратор dataclass из модуля dataclasses:

Затем ты помечаешь класс декоратором @dataclass, и определяешь поля данных, как обычные переменные класса с аннотациями типов:

В этом примере, Point — это dataclass, которая имеет два поля: x и y, оба целого типа. dataclass автоматически создаст: * Конструктор __init__, позволяющий создавать экземпляры класса, например Point(1, 2). * __repr__, возвращающий строковое представление объекта, например Point(x=1, y=2). * __eq__, позволяющий сравнивать объекты, например Point(1, 2) == Point(1, 2).

Пример простого использования

Варианты dataclass

dataclass предоставляет несколько параметров для настройки поведения:

  • init: Если True (по умолчанию), генерируется метод __init__. Если False, метод __init__ не создается.

  • repr: Если True (по умолчанию), генерируется метод __repr__. Если False, метод __repr__ не создается.

  • eq: Если True (по умолчанию), генерируется метод __eq__. Если False, метод __eq__ не создается.

  • order: Если True, генерируются методы сравнения (__lt__, __le__, __gt__, __ge__). По умолчанию False.

  • unsafe_hash: Если False (по умолчанию), метод __hash__ не генерируется. Если True, метод __hash__ будет сгенерирован, а dataclass станет хешируемым.

  • frozen: Если True, экземпляры класса будут неизменяемыми (read-only). По умолчанию False.

Примеры использования параметров

  1. Отключаем метод __repr__ и делаем класс неизменяемым

2. Устанавливаем порядок, добавляем метод hash и делаем класс неизменяемым

Значения по умолчанию

Ты можешь задавать значения по умолчанию для полей:

При создании экземпляра класса, если значения не переданы, будет использовано значение по умолчанию.

Использование dataclass с изменяемыми типами

Будь осторожен при использовании изменяемых типов данных (списки, словари) в качестве значений по умолчанию. Они будут созданы только один раз и будут использоваться всеми экземплярами класса:

В примере выше изменения в bad1.items также отображаются в bad2.items. Это происходит из-за того, что оба экземпляра класса используют один и тот же список по умолчанию.

Чтобы этого избежать, используй dataclasses.field и default_factory:

В этом случае default_factory=list создаст новый пустой список для каждого нового экземпляра класса.

Удачи!

👉 GIT

Другие шпаргалки

Когда использовать dict и list
dict vs SimpleNamespace
Синглтон (Singleton)
Структуры данныx python
Переменные
Строки
Функции

Показать полностью 8
10

101 игра на python. Шпаргалки. Когда использовать dict и list

Примеры использования списков и словарей для представления данных о товарах. Я разложу абстрактный товар по характеристикам и покажу, как использовать список для представления товаров в категории.

  • Словарь (dict) – это идеальный способ представления характеристик одного товара, где есть пары "ключ-значение".

  • Список (list) – это отличный способ представления набора однотипных товаров, где каждый товар может быть представлен словарем.

1. Словарь (dict) для представления характеристик товара

Словарь для представления характеристик одного товара. В этом случае, ключами словаря будут названия характеристик, а значениями – их соответствующие значения.

Разъяснение кода:

  • словарь product, где ключами являются названия характеристик товара (id, name, brand, price и т.д.), а значениями — их соответствующие значения.

  • product.items() для итерации по всем парам "ключ-значение" и вывел их на экран.

2. Список (list) для представления товаров в категории

Список для представления списка товаров в определенной категории. В этом случае, каждый элемент списка будет представлять отдельный товар, который, в свою очередь, может быть представлен словарем.

Разъяснение кода:

  • Список products, где каждый элемент - это словарь, представляющий отдельный товар.

  • Я проитерировал список и вывел на экран информацию о каждом товаре, используя ключи словаря для доступа к характеристикам товара.

  • Я показал, как получить доступ к первому товару в списке, используя индекс 0.

  • Я проитерировал список еще раз, и показал как можно выводить только названия товаров.

Оригинала статьи в GIT

Другие шпаргалки:

Структуры данных в python
Переменные в python: что, как и зачем нужны
Строки в python
Функции в python
Синглтон (Singleton) в Python
dict vs SimpleNamespace в Python

Серия 101 игра на python с разбором кода. Портирую классические игры на язык python с добавлением искусственного интеллекта.

UPD:

КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ

Показать полностью 2
5

Шпаргалки. dict vs SimpleNamespace в Python. Особенности, преимущества, когда какой из них лучше использовать

Оба они позволяют хранить именованные данные, но делают это по-разному, и каждый из них имеет свои особенности.

1. Словари (dict)

  • Словарь в Python – это структура данных, которая хранит пары "ключ-значение". Ключи должны быть неизменяемыми типами данных (например, строки, числа, кортежи), а значения могут быть любыми.

  • Создание: Словари создаются с помощью фигурных скобок {} или функции dict().

  • Доступ к значениям: Значения доступны по ключу с помощью квадратных скобок [].

  • Изменение: Значения можно изменять, добавлять новые пары "ключ-значение" и удалять существующие.

2. SimpleNamespace

  • SimpleNamespace – это простой класс из модуля types, который позволяет обращаться к значениям как к атрибутам объекта. Он хорош для хранения и передачи набора данных.

  • Создание: SimpleNamespace создается с помощью функции SimpleNamespace() и передачей именованных аргументов.

  • Доступ к значениям: Значения доступны как атрибуты объекта с помощью точечной нотации `.`

  • Изменение: Значения можно изменять, добавлять новые атрибуты и удалять существующие.

Преимущества dict

  1. Гибкость ключей: Ключи словаря могут быть любыми неизменяемыми типами данных (строки, числа, кортежи). Это позволяет создавать словари со сложной структурой, где ключами могут быть, например, координаты точек или другие сложные объекты.

  2. Множество методов: Словари предоставляют богатый набор встроенных методов для работы с данными:

    • keys(): Возвращает все ключи словаря.

    • values(): Возвращает все значения словаря.

    • items(): Возвращает все пары "ключ-значение" в виде кортежей.

    • get(): Возвращает значение по ключу или значение по умолчанию, если ключа нет.

    • pop(): Удаляет элемент по ключу и возвращает его значение.

    • и многие другие.

  3. Динамическое создание: Словари можно легко расширять, добавляя новые пары "ключ-значение" во время выполнения программы.

  4. Итерация: Словари можно удобно итерировать: по ключам, по значениям или по парам ключ-значение.

  5. Удобно для JSON: Словари имеют удобное представление для работы с JSON данными

Преимущества SimpleNamespace

  1. Доступ к атрибутам через точку: Доступ к значениям с помощью точечной нотации (my_namespace.attribute) более читаем и удобен, чем использование квадратных скобок и ключей (my_dict["key"]). Это делает код более похожим на работу с обычными объектами.

  2. Удобство при передаче данных: SimpleNamespace удобно использовать для передачи данных в функции или модули, когда нужно передать набор связанных именованных значений. Вы можете передать один объект, вместо нескольких переменных.

  3. Простота создания: SimpleNamespace легко создать, передав именованные аргументы: SimpleNamespace(name="Alice", age=30).

  4. Меньше кода: Для простого доступа к значениям как к атрибутам объекта, использование SimpleNamespace может потребовать меньше кода, чем работа со словарями.

  5. Предсказуемая структура: В отличии от словаря, SimpleNamespace создает объект с конкретными атрибутами.

Когда что использовать:

  • Используй dict когда:

    • У тебя есть динамический набор ключей, которые могут меняться во время выполнения программы.

    • Тебе нужно использовать методы словаря для обработки итерирования данных.

    • Ты работаешь с данными в формате "ключ-значение".

    • Тебе нужны гибкость и динамичность.

    • Тебе нужны ключи, которые не являются строками.

  • Используй SimpleNamespace когда:

    • У тебя есть предопределенный набор именованных значений (атрибутов).

    • Тебе нужно передавать набор данных в виде объекта.

    • Тебе нужна более читаемая точечная нотация для доступа к значениям.

    • Тебе нужна простота и удобство при создании объектов для хранения данных.

    • Когда структура данных не должна меняться динамически.

Пример:

У тебя есть функция, которая принимает данные о пользователе.

В этом примере, для dict я использую метод get, чтобы получить значения, с предустановленным значением, если ключа нет. Для SimpleNamespace я обращаюсь к атрибутам напрямую, что более читаемо.

Оригинала статьи в GIT

Другие шпаргалки:

Структуры данных в python
Переменные в python: что, как и зачем нужны
Строки в python
Функции в python
Синглтон (Singleton) в Python

Серия 101 игра на python с разбором кода. Портирую классические игры на язык python с добавлением искусственного интеллекта.

UPD:

КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ

Показать полностью 5
8

101 игра на python. Шпаргалки. Синглтон (Singleton) в Python

В Python, синглтон – это шаблон проектирования, который гарантирует, что у класса будет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Это значит, что при попытке создать новый объект этого класса, ты всегда будешь получать один и тот же объект.

Синглтоны полезны, когда нужно ограничить количество экземпляров класса, например:

  • Для управления подключением к базе данных (чтобы не открывать много подключений).

  • Для хранения глобальной конфигурации приложения (чтобы все части приложения использовали одну и ту же конфигурацию).

  • Для логгирования (чтобы все сообщения шли в один файл).

Преимущества синглтона:

  • Гарантия единственного экземпляра: Синглтон гарантирует, что класс будет иметь только один экземпляр. Это полезно для управления ресурсами, которые должны быть уникальными.

  • Глобальный доступ: Синглтон предоставляет глобальную точку доступа к экземпляру класса, что упрощает использование этого экземпляра в любой части программы.

Недостатки синглтона:

  • Глобальное состояние: Синглтон может привести к использованию глобального состояния, что может вызывать неожиданные побочные эффекты и усложнять тестирование.

  • Нарушение принципов ООП: Синглтон может нарушать принцип единственной ответственности и инкапсуляции.

Несколько способов реализации синглтона в Python.

1. Реализация Через переопределение метода __new__

  • Mетод __new__ отвечает за создание экземпляра класса. Переопределив его, я смогу контролировать этот процесс.

  • В этом примере я буду хранить единственный экземпляр класса в переменной _instance.

  • Если экземпляра еще нет, я его создам, иначе верну уже существующий экземпляр.

2. Реализация Через декоратор

  • Декоратор – это функция, которая модифицирует класс.

  • В этом примере я создаю функцию-декоратор singleton, которая принимает класс и возвращает его обернутую версию.

  • Внутри декоратора я храню экземпляры классов в словаре instances.

  • Если экземпляр класса еще не создан, я его создам и сохраню в словаре, иначе верну существующий экземпляр.

3. Реализация Через метакласс

  • Mетакласс позволяет контролировать создание классов.

  • В этом примере я создам метакласс SingletonMeta, который будет следить за созданием экземпляров.

  • Метакласс хранит экземпляры классов в словаре _instances.

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

4. Реализация Через модуль

  • В Python модуль сам по себе является синглтоном.

  • Я могу создать объект в модуле, и он будет единственным экземпляром.

Когда использовать синглтон?

  • Когда тебе нужно, чтобы объект существовал в единственном экземпляре (например, конфигурация, логгер, подключение к базе данных).

  • Когда тебе требуется глобальный доступ к этому объекту.

Оригинала статьи в GIT

Другие шпаргалки:

Структуры данных в python
Переменные в python: что, как и зачем нужны
Строки в python
Функции в python

Серия 101 игра на python с разбором кода. Портирую классические игры на язык python с добавлением искусственного интеллекта.

Серия информатика, с изложением терминов

UPD:

КОД ПЕРЕЕХАЛ ПО ЭТОМУ АДРЕСУ

Показать полностью 5
Отличная работа, все прочитано!