Разделы инструкций

В сети

Пользователей: 123
Из них просматривают:
Аналоги: 42. Даташиты: 15. Инструкции: 8. Магазин: 1. Новости: 24. Обзор: 1. Остальное: 6. Программы: 4. Производители: 2. Расчёты: 1. Торрент: 4. Форум: 12. Чат: 3.
Участников: 5
Гостей: 118

an , KT315 , Google , wolf170571 , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

Оглавление

9.2. Области видимости и пространства имён

Перед тем, как знакомиться с классами, следует рассказать о правилах языка, касающихся областей видимости. Определения классов выполняют несколько изящных приемов с пространствами имён, и Вам следует знать о работе областей видимости и пространств имён, для полного понимания происходящего.

Начнём с нескольких определений. Пространство имён определяет отображение имён в объекты. Большинство пространств имен в языке Python реализованы как словари, что, однако, никак себя не проявляет (кроме производительности) и может быть изменено в будущем. Вот несколько примеров пространств имён: множество встроенных имён (функции, исключения), глобальные имена в модуле, локальные имена при вызове функций. В этом смысле множество атрибутов объекта также образует пространство имён. Важно понимать, что между именами в разных пространствах имён нет связи. Например, два модуля могут определить функции с именем "maximize" не создавая при этом путаницы — пользователь должен ссылаться на них с использованием имени модуля в качестве приставки.

Под словом атрибут мы подразумеваем любое имя, следующее после точки: например, в выражении z.real, real является атрибутом объекта z. Строго говоря, имена в модулях являются атрибутами модуля: в выражении modname.funcname, modname является объектом-модулем и funcname является его атрибутом. В этом случае имеет место прямое соответствие между атрибутами модуля и глобальными именами, определёнными в модуле: они совместно используют одно пространство имён1!

Атрибуты могут быть доступны только для чтения, а могут и допускать присваивание. Во втором случае Вы можете записать 'modname.attribute = 42' или даже удалить его, используя инструкцию del: 'del modname.attribute'.

Пространства имён создаются в различные моменты времени и имеют разную продолжительность жизни. Пространство имён, содержащее встроенные имена, создаётся при запуске интерпретатора и существует всё время его работы. Глобальное пространство имён модуля создаётся, когда он считывается, и, обычно, также существует до завершения работы интерпретатора. Инструкции, выполняемые на верхнем уровне, т.е. читаемые из файла-сценария или интерактивно, рассматриваются как часть модуля __main__, имеющего собственное глобальное пространство имён. (В действительности, встроенные имена также находятся в модуле — __builtin__).

Локальное пространство имён функции создается при вызове функции и удаляется при выходе из неё (возвращается значение или генерируется исключение, которое не обрабатывается внутри функции). Безусловно, при рекурсивном вызове создаётся собственное локальное пространство имен для каждого вызова.

Область видимости — фрагмент программы, в котором пространство имён непосредственно доступно, то есть нет необходимости в использовании записи через точку для того, чтобы поиск имени производился в данном пространстве имён.

Несмотря на статическое определение, области видимости используются динамически. В любой момент времени выполнения программы используется ровно три вложенных области видимости (три непосредственно доступных пространства имен). Сначала поиск имени производится во внутренней области видимости, содержащей локальные имена. Далее — в средней, содержащей глобальные имена модуля. И, наконец, во внешней, содержащей встроенные имена.

Обычно локальная область видимости соответствует локальному пространству имён текущей функции (класса, метода). За пределами функции (класса, метода), локальная область видимости соответствует тому же пространству имён, что и глобальная: пространству имён текущего модуля.

Важно понимать, что область видимости определяется по тексту: глобальная область видимости функции, определенной в модуле — пространство имён этого модуля, независимо от того, откуда или под каким псевдонимом функция была вызвана. С другой стороны, реально поиск имён происходит динамически, во время выполнения. Однако язык развивается в сторону статического разрешения имён, определяемого во время "компиляции", поэтому не стоит полагаться на динамическое разрешение имён! (Фактически, локальные переменные уже определяются статически.)

В языке Python есть особенность: присваивание всегда производится имени в локальной области видимости, если перед этим не было указано явно (инструкция global), что переменная находится в глобальной области видимости. Присваивание не копирует данные — оно только привязывает имя к объекту. То же самое верно и для удаления: инструкция 'del x' удаляет имя x из пространства имён, соответствующего локальной области видимости. В сущности, все операции, которые вводят новые имена, используют локальную область. Так, импортирование модуля и определение функции привязывают модуль или функцию к локальной области видимости.

Примечания:
  • Есть одно исключение. Объект-модуль имеет секретный атрибут __dict__, содержащий словарь, используемый для реализации пространства имён модуля. Имя __dict__ является атрибутом, однако не является глобальным именем. Не следует использовать атрибут __dict__ где-либо кроме отладчиков, так как это нарушает абстракцию реализации пространства имён.
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити

Разное

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

Интересно

Можно использовать оплетку телевизионного кабеля абонентского подключения ТВ в многоэтажных домах для заземления.

Похожие инструкции