HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Модули и классы в Python являются пространствами имен. И эти пространства имен открыты для изменения. Во время работы программы вы можете добавить в модуль или класс новые атрибуты:</p>
1 <p>Модули и классы в Python являются пространствами имен. И эти пространства имен открыты для изменения. Во время работы программы вы можете добавить в модуль или класс новые атрибуты:</p>
2 <p>Также вы можете хранить в атрибутах изменяемые сущности - например, списки и словари - и время от времени вносить в них изменения.</p>
2 <p>Также вы можете хранить в атрибутах изменяемые сущности - например, списки и словари - и время от времени вносить в них изменения.</p>
3 <p>Вы могли слышать, что пользоваться глобальными переменными плохо. Так говорят именно из-за того, что очень сложно следить за изменениями в одном месте кода и предсказывать влияние этих изменений на остальные части программы. Так вот, изменяемые (и добавляемые) атрибуты классов и модулей - это тоже глобальные переменные.</p>
3 <p>Вы могли слышать, что пользоваться глобальными переменными плохо. Так говорят именно из-за того, что очень сложно следить за изменениями в одном месте кода и предсказывать влияние этих изменений на остальные части программы. Так вот, изменяемые (и добавляемые) атрибуты классов и модулей - это тоже глобальные переменные.</p>
4 <p>Кому-то эти возможности могут показаться очень удобными, но не нужно заблуждаться: кажущееся удобство практически всегда приводит к тому, что вы тратите много времени на поиск мест, которые внесли подобные изменения, и что-то в итоге сломалось. Ошибиться очень легко, а затронута будет большая часть программы. Ведь изменения, вносимые в класс, влияют на все экземпляры этого класса - не только на будущие, но и на уже созданные.</p>
4 <p>Кому-то эти возможности могут показаться очень удобными, но не нужно заблуждаться: кажущееся удобство практически всегда приводит к тому, что вы тратите много времени на поиск мест, которые внесли подобные изменения, и что-то в итоге сломалось. Ошибиться очень легко, а затронута будет большая часть программы. Ведь изменения, вносимые в класс, влияют на все экземпляры этого класса - не только на будущие, но и на уже созданные.</p>
5 <p>С модулями все становится еще опаснее: объект модуля всегда один на всю программу, потому что Python запоминает все модули, которые куда-то импортировались хотя бы раз, и при последующих импортах модуля возвращает ссылку на уже загруженный модуль. Соответственно, изменения, вносимые в модуль, затрагивают все модули, которые его импортируют. Представьте, что у вас есть код, который строит логику, исходя из значения константы в атрибуте модуля, и вдруг в совершенно другом месте программы происходит изменение этой константы - такие ситуации очень тяжело отлаживать.</p>
5 <p>С модулями все становится еще опаснее: объект модуля всегда один на всю программу, потому что Python запоминает все модули, которые куда-то импортировались хотя бы раз, и при последующих импортах модуля возвращает ссылку на уже загруженный модуль. Соответственно, изменения, вносимые в модуль, затрагивают все модули, которые его импортируют. Представьте, что у вас есть код, который строит логику, исходя из значения константы в атрибуте модуля, и вдруг в совершенно другом месте программы происходит изменение этой константы - такие ситуации очень тяжело отлаживать.</p>
6 <p>Не используйте изменяемые объекты-одиночки, каковыми являются большинство классов и все модули. Исключения возможны, но они обычно предполагают, что вы знаете, что делаете, и готовы к последствиям.</p>
6 <p>Не используйте изменяемые объекты-одиночки, каковыми являются большинство классов и все модули. Исключения возможны, но они обычно предполагают, что вы знаете, что делаете, и готовы к последствиям.</p>
7 <blockquote><p>Одиночка или singleton - название приема, который позволяет во всех местах программы работать с неким объектом, который всегда существует в единственном экземпляре, но при этом объект не передается явно между местами в коде, которые его используют. Пример одиночки: объект, хранящий конфигурацию программы. Она загружается из внешнего источника (например, файла) при первом обращении к объекту, а затем все последующие обращения к конфигурации сразу же получают доступ к уже загруженному объекту.</p>
7 <blockquote><p>Одиночка или singleton - название приема, который позволяет во всех местах программы работать с неким объектом, который всегда существует в единственном экземпляре, но при этом объект не передается явно между местами в коде, которые его используют. Пример одиночки: объект, хранящий конфигурацию программы. Она загружается из внешнего источника (например, файла) при первом обращении к объекту, а затем все последующие обращения к конфигурации сразу же получают доступ к уже загруженному объекту.</p>
8 </blockquote>
8 </blockquote>