Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

10.5 Пространства имен

Пространство имен - отображение имен (идентификаторов) к объектам. По функциональности пространства имен эквивалентны словарям и реализуются в виде словарей.

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

Является ли имя локальным или глобальным определяется в момент компиляции: в отсутствии инструкции global, имя, добавляемое где-либо в блоке кода, является локальным во всем блоке; все остальные имена считаются глобальными. Инструкция global позволяет заставить интерпретатор считать указанные имена глобальными.

3Если блок программы содержит инструкцию exec или from ... import *, семантика локальных имен изменяется: сначала производится их поиск в локальном пространстве имен, затем в глобальном и пространстве встроенных имен.

10.4.6 Определение класса

Определение класса создает объект-класс (class, см. раздел 11.6.1):

class class name[ (base classes)]: suite

Здесь base classes - список выражений (см. раздел 10.2.8), каждое из которых должно давать объект-класс. Для класса создается новое локальное пространство имен, глобальное пространство имен используется текущее (то есть того блока кода, в котором находится определение класса) и в этом окружении выполняется блок suite (обычно содержит только определения функций). После выполнения блока suite локальное пространство имен класса (используется для создания словаря атрибутов класса) и список базовых классов (значения выражений, входящих в base classes) сохраняется в созданном объекте-классе и объект-класс привязывается к имени class name в текущем локальном пространстве имен.

Имена, определенные в пространстве имен класса являются атрибутами класса - общими для всех экземпляров класса. Для того, чтобы определить атрибут экземпляра класса (имя в пространстве имен экземпляра класса), необходимо присвоить ему значение в одном из методов (например, при инициализации экземпляра - в методе init () ). И атрибуты класса, и атрибуты экземпляра доступны с использованием записи через точку (instance. name) - атрибуты экземпляра "прячут" атрибуты класса с таким же именем. Атрибуты класса, значение которых равно неизменяемому объекту, могут служить как значения по умолчанию для атрибутов экземпляров этого класса.



Имена могут быть добавлены (только в локальное пространство имен) следующими способами:

• передача формальных аргументов функции,

• использование инструкции import,

• определение класса или функции (добавляет в локальное пространство имен имя класса или функции),

• использование оператора присваивания,

• использование цикла for (в заголовке указывается новое имя),

• указывая имя во второй позиции после ключевого слова except.

Если глобальное имя не найдено в глобальном пространстве имен, его поиск производится в пространстве встроенных имен, которое, на самом деле, является пространством имен модуля builtin . Этот модуль (или словарь определенных в нем имен) доступен под глобальным именем текущего блока builtins . Если же имя не найдено в пространстве встроенных имен, генерируется исключение NameError.

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

Тип блока

Глобальное

Локальное

пространство имен пространство имен

Модуль (программа и ин- пространство имен модуля то же, что и глобальное терактивные команды фактически являются модулем main )

Класс

Функция (если объект кода, представляющий тело функции, выполняется с помощью инструкции exec , Вы можете сами определить, какие пространства имен использовать)

Выражение, вычисляемое с помощью функции input()

пространство имен модуля, в котором находится определение класса

пространство имен модуля, в котором находится определение функции

новое пространство имен (пространство имен класса), создается в момент выполнения определения

новое пространство имен (пространство имен функции), создается каждый раз при вызове функции

глобальное пространство локальное пространство имен блока, из которого имен блока, из которого

вызывается функция

вызывается функция



Глава 10. Синтаксис и семантика

Тип блока

Глобальное Локальное пространство имен пространство имен

Строка, файл или объект кода, выполняемые с помощью инструкции exec, или функций eval() или execfile() (используя необязательные аргументы, Вы можете сами определить, какие пространства имен использовать)

по умолчанию используется глобальное пространство имен блока, в котором выполняется инструкция или из которого вызывается функция

по умолчанию используется локальное пространство имен блока, в котором выполняется инструкция или из которого вызывается функция

Встроенные функции globals() и locals() возвращают словарь, представляющий глобальное и локальное пространства имен соответственно (см. главу 12).



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 [ 37 ] 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145