Перейти к содержанию

Разное

То что не уместилось в другие разделы или недостойно существования отдельной статьи.

Различие между __new__ и __init__

__new__ конструирует класс и принимает ссылку на тип для которого запрошено конструирование.
__init__ инициализирует инстанс ранее созданного типа(класса)

В чем разница между staticmethod и classmethod?

В classmethod неявно вместо self передается тип класса (cls). В staticmethod ни self, ни cls не передаются, они ведут себя как простые функции, за исключением того что их можно вызывать с экземпляра класса или самого класса.

Как работает yield?

yield - это как return, но вернет генератор. Во время запуска такой функции, она будет исполняться до тех пор пока не наткнется на генератор. Когда наткнется - она вернет значение, и пойдет исполняться заново. Но в отличии от обычной функции, функция-генератор сохраняет все локальные переменные в области функции, которые были при предыдущем запуске.
Так же генератор ведет себя как итератор.

Как работает yield from?

Это такая замена для for item in generator. Он просто получает значение с выбранного генератора в функции-генераторе.

Сохраняет ли словарь порядок элементов при добавлении?

C python 3.6 сохраняет. Если не 3.6 - используйте OrderedDict.

Как осуществляется управление памятью в Python?

Память в Python выделяется прозрачно, управление объектами происходит с помощью системы счётчиков ссылок (reference count), и память высвобождается, когда счётчик падает до нуля. Для разрешения проблем с циклическими ссылками есть GC.

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

Как в Python работает сборщик мусора?

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

Циклический сборщик мусора разделяет все объекты на 3 поколения (генерации). Новые объекты попадают в первое поколение. Если новый объект выживает процесс сборки мусора, то он перемещается в следующее поколение. Чем выше поколение, тем реже оно сканируется на мусор.

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

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

Проекты

Интересные проекты для изучения:

Ссылки