The Python Language Reference / Справочник по языку Python: 3. Модель данных

← →
Английский оригинал Перевод на русский

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

Назначение атрибуту, по сути, обновляет словарь области имён модуля, например "m.x = 1" эквивалентно "m.__dict__['x'] = 1" .

Hittih 18.02.10 в 05:17

0

Специальный атрибут только для чтения : "__dict__" - область имён модуля, в виде объекта словарь.

Hittih 18.02.10 в 05:22

0

Предопределённые изменяемые атрибуты : "__name__" - имя данного модуля; "__doc__" - строка описания данного модуля, или иначе значение "None" ; "__file__" - путь файла, из которого загружен данный модуль, если он был загружен из файла. Атрибут "__file__" отсутствует в модулях на "C" , которые статически прилинкованы к интерпретатору; для модулей расширений, подгруженных динамически из общих библиотек - он является путём файла соответствующей общей библиотеки.

Hittih 18.02.10 в 07:13

0

Классы, определяемые пользователем

Hittih 30.11.10 в 16:12

0

Типы определяемых классов, как правило, создаются определением класса (смотрите раздел "Определения классов"). Класс имеет область имён реализованую в виде объекта словарь. Указания атрибутов класса преобразуются в поиск в этом словаре, например, "C.x" заменяется на "C.__dict__['x']" (хотя есть ряд трюков, которые позволяют разместить атрибуты другим путём). Когда имя данного атрибута там не найдено, поиск атрибута продолжается в базовых классах. Такой поиск базовых классов использует порядок разрешения метода C3, который ведет себя правильно, даже в случае структуры наследования типа "diamond", тоесть, где есть несколько путей наследования сходящихся обратно к одному общему предку. Дополнительную информацию об C3 MRO можно найти в документации, сопровождающей релиз 2.3 по адресу : "http://www.python.org/download/releases/2.3/mro/".

Hittih 18.02.10 в 10:40

0

Когда указание на атрибут класса (назовём класс «<code>C</code>») должно давать объект - метод класса – он преобразуется в объект - метод экземпляра, чей атрибут «<code>__self__</code>» имеет значение «<code>C</code>» . А когда это указание должно давать объект - статический метод – он преобразуется в тот же объект «обёрнутый» объектом - статическим методом. Другие варианты, того как атрибуты, получаемые из класса, могут отличаться от реально содержащихся в их атрибуте «<code>__dict__</code>» – смотрите в разделе «Реализация дескрипторов» .

Hittih 01.12.10 в 16:55

0

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

Hittih 22.02.10 в 06:53

0

Объект класс может быть вызван (запущен на исполнение), как упомянуто выше, чтобы сгенерировать экземпляр класса (смотрите ниже).

Hittih 22.02.10 в 06:59

0

Специальные атрибуты: "__name__" - имя класса; "__module__" - имя модуля, в котором был определен этот класс; "__dict__" - словарь, содержащий область имён этого класса; "__bases__" - кортеж (возможно, пустой или с одним элементом ("Singleton")), содержащий базовые классы, в порядке их появления в списке базовых классов; "__doc__" - строка описания данного класса, или иначе значение "None".

Hittih 22.02.10 в 07:17

0

Экземпляры классов

Hittih 22.02.10 в 07:19

0

Экземпляр класса создается путем вызова объекта класс (см. выше). Экземпляр класса имеет область имён, реализованную в виде словаря, который является первым местом, в котором ищутся атрибуты. Если атрибут здесь не найден, а класс этого экземпляра имеет атрибут с таким именем, поиск продолжается в атрибутах класса. Если становится известно, что некий атрибут класса является объектом функцией пользователя, он преобразуется в объект метод экземпляра, чей атрибут "__self__" является тем экземпляром. Статические методы и объекты методы класса также преобразуются, см. выше в разделе "Классы". Смотрите также в разделе "Реализация дескрипторов" другой путь, которым атрибуты класса, полученного через его экземпляры, могут отличаться от объектов, на самом деле хранящихся в атрибуте "__dict__" этого класса. Если атрибут класса не найден, но класс этого объекта имеет метод "__getattr__()", то этот метод вызывается и возвращаемое им значение возвращается в качестве значения искомого атрибута.

Hittih 22.02.10 в 09:49

0

Запись значения в атрибуты и их удаление обновляют словарь экземпляра. Если класс имеет методы "__setattr__()" или "__delattr__()", то вызываются они - вместо обновления словаря экземпляра напрямую.

Hittih 22.02.10 в 10:00

0

Экземпляры класса могут вести себя как числа, последовательности или отображения, если у них есть методы с определёнными специальными именами. См. раздел "Имена специальных методов".

Hittih 22.02.10 в 10:11

0

Специальные атрибуты: "__dict__" - словарь атрибутов; "__class__" - класс данного экземпляра.

Hittih 22.02.10 в 10:29

0

Файлы

Hittih 22.02.10 в 10:29

0

Файловый объект представляет собой открытый файл. Файловые объекты создаются встроенной функцией "open()", а также функциями "os.popen()", "os.fdopen()", и методом "Makefile()" объектов сокетов (и, возможно, другими функциями или методами, предоставляемыми модулями расширения ). Объекты sys.stdin, sys.stdout и sys.stderr инициализируются в файловые объекты, соответствующие стандартным вводу, выводу и потоку ошибок интерпретатора. См. "Файловые объекты" для полного описания файловых объектов.

Hittih 22.02.10 в 11:05

0

Внутренние типы

Hittih 22.02.10 в 11:06

0

Несколько типов, используемых для внутренних целей интерпретатором, предоставяются пользователю. Их определения могут измениться в будущих версиях интерпретатора, но они упоминаются здесь для полноты.

Hittih 22.02.10 в 11:19

0

Объекты кода

Hittih 22.02.10 в 11:21

0

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

Hittih 11.07.10 в 11:08

0

Специальные атрибуты только для чтения:
"co_name" содержит имя данной функции;
"co_argcount" это количество позиционных аргументов (в том числе аргументов со значениями по умолчанию);
"co_nlocals" это число локальных переменных, используемых функцией (включая аргументы);
"co_varnames" кортеж, содержащий имена локальных переменных (начиная с имен аргументов);
"co_cellvars" кортеж, содержащий имена локальных переменных, на которые ссылаются вложенные функции;
"co_freevars" кортеж, содержащий имена свободных переменных;
"co_code" строка, представляющая последовательность байт-код инструкций;
"co_consts" кортеж, содержащий непосредственные данные используемые байт-кодом;
"co_names" кортеж, содержащий имена, используемые байт-кодом;
"co_filename" имя файла, из которого код был скомпилирован;
"co_firstlineno" номер первой строки функции;
"co_lnotab" текст, кодирующий соответствие смещения байт-кодов номерам строк текста программы (подробнее см. исходный код интерпретатора);
"co_stacksize" требуемый размер стека (включая локальные переменные);
"co_flags" целое число, в котором закодировано некоторое количество параметров(флагов) интерпретатора.

Hittih 11.07.10 в 12:17

0

Следующие сигнальные биты определены внутри "co_flags" : бит 0x04 установлен, если данная функция использует синтаксис "*arguments" для принятия произвольного количеотва позиционных аргументов; бит 0x08 установлен, если данная функция использует синтаксис "**keywords" для принятия произвольных именованных аргументов; бит 0x20 установлен, если функция является генератором.

Hittih 11.07.10 в 12:47

0

Инструкция «<code>from __future__ import division</code>» также использует биты в «<code>co_flags</code>» для обозначения того, был ли объект-код скомпилирован со включенными определёнными свойствами. Так, бит «<code>0x2000</code>» установлен, если данная функция скомпилирована с задействованием «future division» . Биты «<code>0x10</code>» и «<code>0x1000</code>» использовались в более ранних версиях Питона.

Hittih 13.12.10 в 21:54

0

Другие биты в "co_flags" - зарезервированы для внутреннего использования.

Hittih 11.07.10 в 14:57

0

Если объект кода является функцией, то первый элемент в "co_consts" содержит текст описания (документацию) данной функции, или значение "None" .

Hittih 11.07.10 в 15:46

0

Объекты-кадры

Hittih 02.12.10 в 07:36

0

Объекты-кадры реализуют кадры исполнения. Они могут встречаться в объектах раскрутки стека (смотри́те далее) .

Hittih 05.01.12 в 08:15

0

Специальные атрибуты только для чтения: «<code>f_back</code>» указывает предыдущий кадр стека (в сторону вызывающего), или «<code>None</code>» если это дно стека; «<code>f_code</code>» является объектом-кодом, выполняющимся в данном кадре; «<code>f_locals</code>» является словарём, использующимся для поиска локальных переменных; «<code>f_globals</code>» используется для глобальных переменных; «<code>f_builtins</code>» используется для встроенных (внутренних) имён; «<code>f_lasti</code>» дает точные инструкции (это индекс в массиве байт-кода у объекта кода) .

Hittih 05.01.12 в 08:12

0

Специальные перезаписываемые атрибуты: «<code>f_trace</code>» , если не «:const:None» , является функцией, вызываемою в начале каждой строки исходного кода (это используется отладчиком); «<code>f_lineno</code>» содержит номер текущей строки кадра – запись сюда изнутри функции отслеживания (трассирования) приводит к переходу на данную строку (только для самого нижнего кадра) . Отладчик может реализовать команду “Jump” , путём записи в «<code>f_lineno</code>» .

Hittih 05.01.12 в 08:48

0

Объекты раскрутки стека

Hittih 05.01.12 в 08:59

0

Объекты раскрутки стека представляют раскрутку стека исключений. Объект раскрутки стека создается при возникновении исключения. Когда поиск обработчика исключения раскручивает стек вызовов, на каждом уровне новый объект раскрутки стека вставляется перед текущим. Когда обработчик исключения найден, раскрутка стека делается доступной для программы. (Смотри́те раздел “Инструкция «try»” .) Она доступна в качестве третьего элемента кортежа, возвращаемого «<code>sys.exc_info()</code>» . Если программа не содержит подходящего обработчика, раскрутка стека выводится (в нормально оформленном виде) в стандартный поток ошибок, а если интерпретатор в интерактивном режиме, то она также доступна пользователю через «<code>sys.last_traceback</code>» .

Hittih 05.01.12 в 09:41

0

Специальные атрибуты только для чтения: «<code>tb_next</code>» указывает следующий уровень в стеке (в сторону кадра, где произошло исключение) , или «<code>None</code>» , если нет следующего уровня; «<code>tb_frame</code>» указывает на кадр исполнения текущего уровня; «<code>tb_lineno</code>» дает номер строки, где произошло исключение; «<code>tb_lasti</code>» указывает точную инструкцию. Номер строки и последняя команда в раскрутке может отличаться от номера строки соответствующего объекта кадра, если исключение произошло в инструкции «<code>try</code>» не имеющей соответствующей ветви «<code>except</code>» , или с ветвью «<code>finally</code>» .

Hittih 05.01.12 в 11:35

0

Объекты - срезы (извлечения, slices)

Hittih 11.07.10 в 16:02

0

Объекты-срезы используются для хранения параметров для операции среза (которая может быть явно вызвана через метод "__getitem__()" ). Объект-срез также может быть создан встроенной функцией "slice()" .

Hittih 11.07.10 в 18:07

0

Особые атрибуты только для чтения:
"start" - нижняя граница;
"stop" - верхняя граница;
"step" - значение шага;
все они по умолчанию имеют значение "None" . Эти атрибуты могут быть любого типа.

Hittih 11.07.10 в 16:15

0

Объекты-срезы поддерживают один метод:

Hittih 12.07.10 в 11:11

0

slice.indices(self, length)

Hittih 12.07.10 в 11:12

0

Этот метод принимает один аргумент - целое число "length" и преобразовывает параметры среза (пропущенные, выходящие за границы (отрицательные или превышающие)) так, как они были бы преобразованы будучи применёнными (к любой) последовательности длины "length" (т. е. , например, граница среза, превышающая длину, заменяется на эту длину). Именно это преобразование производится при обычной записи срезов. Этот метод возвращает кортеж из 3 целых чисел, являющихся соответственно параметрами "start", "stop", "step" .

Hittih 12.07.10 в 13:10

0

Обьекты статических методов

Hittih 12.07.10 в 13:17

0

Обьекты - статичесие методы

Hittih 12.07.10 в 13:18

0

Статические методы

Hittih 30.11.11 в 05:04

0

Объекты статических методов обеспечивают способ предотвращения преобразования функциональных объектов в объекты методов, описанные выше. Объекты статических методов могут быть посредниками ("обертками") для любых других объектов, обычно для определяемых пользователем объектов методов. Когда объект статического метода запрашивается из класса или экземпляра класса, то фактически возвращается объект, к которому тот является посредником (т.е. "обёрнутый объект"), если он в свою очередь не подлежит дальнейшей трансформации. Объекты статических методов сами не являются исполнимыми, хотя те объекты, к которым они явлвются посредниками - обычно явлвются. Объекты статических методов создаются при помощи встроенного конструктора "staticmethod()" .

Hittih 12.07.10 в 15:15

0

Объекты методов классов

Hittih 12.07.10 в 15:17

0

Объект метода класса, как и объект статического метода, является посредником к другому объекту, изменяющим способ, которым этот объект извлекается из классов и экземпляров класса. Поведение объектов метода класса при таком доступе описано выше, в разделе "Определяемые пользователем методы". Объекты методов классов создаются при помощи встроенного конструктора "classmethod()" .

Hittih 12.07.10 в 16:08

0

3.3. Имена спецальных методов
Класс может реализовывать определенные операции, которые вызываются при использовании специального синтаксиса (например, арифметические операции или индексаця и срезы), путем определения методов со специальными именами. Это Питоновский подход к переопределению операторов, позволяющему классам определять их собственное поведение по отношению к операторам языка. Например, если класс определяет метод под названием "__getitem__()" и "x" экземпляр этого класса, то "x[i]" приблизительно равно "type(x).__getitem__(x, i)". За исключением тех случаев, где это особо оговорено – попытки исполнять операции вызывают исключение, если не определено соответствующего метода (обычно "AttributeError" или "TypeError" ) .

Hittih 12.07.10 в 19:46

0
+1

При реализации класса, который эмулирует любой встроенный тип, важно, что эмуляция должна быть реализована только в той степени, в какой это имеет значение для моделируемого объекта. Например, некоторые последовательности могут хорошо работать с извлечением отдельных элементов, но срезы могут не иметь смысла. (Одним из примеров этого является интерфейс "NodeList" в "W3C’s Document Object Model".)

Hittih 12.07.10 в 20:17

0

3.3.1. Основные средства настройки классов

«<code>object.__new__(cls[, ...])</code>»

Hittih 02.02.11 в 15:18

0

Вызывается для создания нового экземпляра класса «<code>cls</code>» . «<code>__new__()</code>» – это статический метод (специальный, создаваемый автоматически) , который принимает в качестве первого аргумента класс, экземпляр которого требуется вернуть. Остальные аргументы такие же, какие передаются конструктору этого же объекта (в выражении «<code>cls()</code>» ) . «<code>__new__()</code>» должен возвращать новый экземпляр объекта ( обычно экземпляр класса «<code>cls</code>» ) .

Hittih 06.01.11 в 18:11

0

Обычно применяется для создания нового экземпляра класса через вызов метода «<code>__new__()</code>» у «суперкласса» данного класса, вызывая «<code>super(currentclass, cls).__new__(cls[, ...])</code>» с соответствующими аргументами, и затем модифицируя (при необходимости) новосозданный экземпляр перед его возвращением.

Hittih 06.01.11 в 18:29

0

Если «<code>__new__()</code>» возвращает экземпляр класса «<code>cls</code>» , то будет вызван метод «<code>__init__()</code>» этого нового экземпляра : «<code>__init__(self[, ...])</code>» , где «<code>self</code>» – это данный новый экземпляр, а остальные аргументы – именно те, которые были переданы в «<code>__new__()</code>» .

Hittih 06.01.11 в 18:43

0

Если «<code>__new__()</code>» не возвращает экземпляр класса «<code>cls</code>» , то метод «<code>__init__()</code>» нового экземпляра не будет вызываться.

Hittih 06.01.11 в 18:47

0

«<code>__new__()</code>» главным образом нужен для того, чтобы дать возможность классам, производным от неизменяемых типов (таких как “int” , “str” , “tuple”) , настраивать создание экземпляров. Он к тому же часто переопределяется в метаклассах для настройки создания класса.

Hittih 02.02.11 в 15:46

0
Минутку...

← Предыдущая страница

Следующая страница →