![](/user_photo/1319_hJRrZ.png)
[ Россум, Дрейк, Откидач ] Язык программирования Python
.pdf![](/html/1319/244/html_G5lOt33H99.SxOE/htmlconvd-92eOgE161x1.jpg)
11.6. Классы и экземпляры классов |
161 |
3.Если y является экземпляром класса:
(a)Если для y определен метод __coerce__(), x и y заменяются значениями, содержащимися в кортеже x.__coerce__(y); если же метод __coerce__() возвращает None, перейти к пункту 4.
(b)Если после преобразований ни x, ни y не является экземпляром, перейти к пункту 4.
(c)Если для y определен метод __rop__, вернуть y.__rop__(x), в противном случае восстановить значения x и y, которые были перед выполнением пункта 3a.
4.(a) Если x является последовательностью и op — + или *, выполняется объединение и размножение соответственно.
(b)В противном случае оба операнда должны быть числами. По возможности они приводятся к общему типу, и для этого типа выполняется соответствующая операция.
__coerce__(self, other)
Вызывается для приведения операндов к общему11 типу. Должен возвращать кортеж, содержащий self и other, приведенные к общему типу, или None, если осуществить преобразование невозможно. В тех случаях, когда общий тип будет типом второго аргумента (other), эффективнее вернуть None, так как интерпретатор также будет пытаться вызвать метод __coerce__ второго аргумента (иногда, однако, реализация другого типа не может быть изменена, в этом случае полезно осуществить приведение к типу второго аргумента здесь).
__add__(self, other)
__sub__(self, other)
__mul__(self, other)
__div__(self, other)
__mod__(self, other)
__divmod__(self, other)
__pow__(self, other [, modulo])
__lshift__(self, other)
__rshift__(self, other)
__and__(self, other)
__xor__(self, other)
__or__(self, other)
Вызываются (для правого операнда) для реализации бинарных операторов +, -, *, /, %, встроенной функции divmod(), оператора ** и встроенной функции pow(), операторов <<, >>, &, ^ и | соответственно. Например, для того чтобы вычислить выражение x+y, где x является экземпляром класса, имеющим метод __add__,
11Иногда полезно возвратить значения разного типа, например список и целое число.
162 |
Глава 11. Встроенные типы данных |
вызывается x.__add__(y). Обратите внимание, что, если должен поддерживаться вызов встроенной функции pow() с тремя аргументами, метод __pow__() должен быть определен с третьим необязательным аргументом.
__radd__(self, other)
__rsub__(self, other)
__rmul__(self, other)
__rdiv__(self, other)
__rmod__(self, other)
__rdivmod__(self, other)
__rpow__(self, other)
__rlshift__(self, other)
__rrshift__(self, other)
__rand__(self, other)
__rxor__(self, other)
__ror__(self, other)
Вызываются (для левого операнда) для реализации перечисленных выше операций, если правый операнд не имеет соответствующего метода (без буквы ‘r’). Например, для того чтобы вычислить выражение x-y, где y является экземпляром класса, имеющим метод __rsub__, вызывается y.__rsub__(x). Обратите внимание, что функция pow(), вызванная с тремя аргументами, не будет пытаться использовать метод __rpow__() (правила приведения типов были бы слишком сложными).
__iadd__(self, other)
__isub__(self, other)
__imul__(self, other)
__idiv__(self, other)
__imod__(self, other)
__ipow__(self, other)
__ilshift__(self, other)
__irshift__(self, other)
__iand__(self, other)
__ixor__(self, other)
__ior__(self, other)
Вызываются для реализации операций с присваиванием (изменением исходного объекта) +=, -=, *=, /=, %=, **= <<=, >>=, &=, ^= и |= соответственно. Эти методы должны не возвращать результат, а модифицировать объект, к которому метод применяется. Если соответствующий метод не определен, операция ‘x op= y’ выполняется как ‘x = x op y’.
11.7. Файловые объекты |
163 |
11.7Файловые объекты
Объекты типа file создаются встроенной функцией open() (см. главу 12), а также с помощью функций os.popen() и os.fdopen() (см. описание модуля os). Кроме того, различные модули предоставляют пути создания объектов с аналогичным интерфейсом (например, метод makefile() объектов, представляющих сетевое соединение). Переменные sys.stdin, sys.stdout и sys.stderr (см. описание модуля sys) инициализируются файловыми объектами, соответствующими стандартным потокам ввода, вывода и ошибок.
Если при выполнении операции над объектом-файлом возникает ошибка вводавывода, включая ситуации, при которых по каким-либо причинам операция не определена (например, метод seek() файлового объекта, представляющего устройство tty, или запись в файл, открытый для чтения), генерируется исключение IOError.
Объекты file имеют следующие методы:
close()
Закрывает файл. При попытке произвести какую-либо операцию над закрытым файлом генерируется исключение ValueError. Допускается вызов метода close() более одного раза.
flush()
Сбрасывает содержимое внутреннего буфера.
isatty()
Возвращает истину, если файл соответствует устройству tty, иначе возвращает 0 (ложь). Если объект с интерфейсом, характерным для файловых объектов, не ассоциирован с реальным файлом, для него этот метод не должен быть реализован.
fileno()
Возвращает дескриптор файла (целое число), используемый для запросов к операционной системе для выполнения операций ввода/вывода. Может быть полезен для выполнения операций низкого уровня, использующих дескрипторы (например, определенные в модулях os и fcntl). Если объект с интерфейсом, характерным для файловых объектов, не ассоциирован с реальным файлом, для него этот метод не должен быть реализован.
read([size])
Считывает не более size байт из файла (меньше, если конец файла достигается раньше, чем прочитано size байт). Если аргумент size опущен или отрицательный, считывается все содержимое файла. Считанные байты возвращаются в виде строкового объекта. Для некоторых файлов (например, устройства tty) вполне осмысленно продолжение чтения после достижения конца файла.
readline([size])
Считывает и возвращает строку из файла, включая завершающий символ новой
![](/html/1319/244/html_G5lOt33H99.SxOE/htmlconvd-92eOgE164x1.jpg)
164 |
Глава 11. Встроенные типы данных |
строки12 (в последней строке файла он может отсутствовать). Если задан неотрицательный аргумент size, считывается не более size байт (учитывая завершающий символ новой строки). В этом случае возвращаемая строка может быть неполной.
readlines([sizehint])
Считывает все содержимое файла и возвращает список строк. Если задан неотрицательный аргумент sizehint, считывает (по сумме длин строк) примерно sizehint байт (sizehint округляется в большую сторону таким образом, чтобы значение было кратным размеру внутреннего буфера). Объекты с интерфейсом, характерным для файловых объектов, могут игнорировать значение sizehint.
seek(offset [, whence])
Устанавливает текущую позицию в файле. Необязательный аргумент whence указывает на точку отсчета: 0 (по умолчанию) — начало файла, 1 — текущая позиция и 2 — конец файла.
tell()
Возвращает текущую позицию в файле.
truncate([size])
Усекает файл до заданного (size) размера. По умолчанию размер равен текущей позиции. Наличие этого метода зависит от операционной системы.
write(s)
Записывает строку s в файл. Заметим, что из-за использования буферизации строка на самом деле может не быть записана в файл до тех пор, пока не будет вызван метод flush() или close().
writelines(slist)
Записывает строки из списка slist в файл. Метод writelines() не добавляет разделители строк. Начиная с версии 1.6, slist может быть последовательностью любого типа, не обязательно list.
Файловые объекты также имеют следующие атрибуты:
closed
Текущее состояние файлового объекта: истина, если файл закрыт, иначе ложь. Доступен только для чтения, значение изменяется при использовании метода close(). Этого атрибута может не быть у объектов, аналогичных файловым.
mode
Режим ввода/вывода. Если файловый объект был создан с помощью встроенной функции open(), равен переданному ей аргументу mode. Доступен только для чтения. Этого атрибута может не быть у объектов, аналогичных файловым.
12Основным достоинством того, что завершающий символ строки остается в возвращаемой строке, является возможность использования пустой строки для обозначения достижения конца файла.
11.8. Вспомогательные объекты |
165 |
name
Если файловый объект был создан с помощью встроенной функции open(), равен имени файла. В противном случае, равен строке, которая указывает на происхождение файлового объекта, в виде ‘<РТПЙУИПЦДЕОЙЕ>’. Доступен только для чтения.
softspace
Показывает, должен ли выводиться пробел перед выводом следующего значения с помощью инструкции print (истина) или нет (ложь). При создании собственных типов файловых объектов следует позаботиться о наличии доступного для записи атрибута softspace, который должен быть инициализирован нулем. Для классов, реализованных на языке Python, это происходит автоматически.
11.8 Вспомогательные объекты
11.8.1 Пустой объект
Тип None принимает единственное значение, и существует единственный объект этого типа, который доступен через встроенное имя None. Объект None используется для указания на отсутствие значения во многих ситуациях (например, если функция не возвращает явно никакого значения). Значение None всегда ложно.
11.8.2 Объекты типа
Объекты типа (type) представляют типы различных объектов. Вы можете получить объект типа для любого объекта (в том числе и для самого объекта типа) с помощью встроенной функции type(). В стандартном модуле types определены объекты типа для всех встроенных типов.
Объекты типа имеют следующие атрибуты, доступные только для чтения:
__doc__
Строка документации, описывающая назначение объектов данного типа, или None.
__name__
Имя типа. Именно эти имена используются в настоящей книге: Вы можете найти описание любого встроенного типа, воспользовавшись предметным указателем.
Строковое представление объектов типа выводится (например, инструкцией print) в виде ¨<type ’ÉÍÑ ÔÉÐÁ’>¨.
166 |
Глава 11. Встроенные типы данных |
11.8.3Представление расширенной записи среза
Эллипсис
Тип ellipsis принимает единственное значение, и существует единственный объект этого типа, который доступен через встроенное имя Ellipsis. Объект Ellipsis используется для указания на использование эллипсиса (‘...’) в расширенной записи среза. Значение объекта Ellipsis всегда истинно.
Срез |
|
|
|
|
Объекты |
типа |
slice |
используются для представления расширенной записи сре- |
|
зов, |
то |
есть, |
если |
срез записывается с использованием двух символов двое- |
точия |
(obj[i:j:s]), |
указывается несколько срезов или используется эллипсис |
(obj[i:j, k:l], obj[..., i:j]). Кроме того, Вы можете создать объект slice, используя встроенную функцию slice().
Объекты среза имеют следующие атрибуты, доступные только для чтения (каждый из них может быть любого типа и равен None, если соответствующий аргумент в записи среза ‘start:stop:step’ опущен):
start
Нижняя граница.
stop
Верхняя граница.
step
Шаг.
Фактически объект среза представляет множество индексов ‘range(start, stop, step)’.
11.9Детали реализации
11.9.1 Объекты кода
Объекты кода (code) используются для представления байт-компилированного исполняемого кода, такого как тело функции. Разница между объектом-кодом и объектомфункцией состоит в том, что объект-функция содержит явную ссылку на словарь, представляющий глобальное пространство имен модуля, в котором определена функция, в то время как объект-код “не знает” контекста, в котором он будет выполняться. Кроме того,
11.9. Детали реализации |
167 |
значения аргументов по умолчанию сохраняются в объекте-функции, так как они вычисляются во время выполнения. Объект-код, в отличие от объекта-функции, неизменяем и не содержит ссылок (прямо или косвенно) на изменяемые объекты.
Объект-код создается с помощью встроенной функции compile(), а также может быть извлечен из объекта-функции используя его атрибут func_code. Объект-код можно выполнить с помощью инструкции exec или вычислить представляемое им выражение с помощью встроенной функции eval().
Объекты кода имеют следующие атрибуты, доступные только для чтения:
co_name
Содержит имя функции (или ’?’, если объект-код создан с помощью функции compile()).
co_argcount
Число позиционных аргументов функции (включая аргументы, имеющие значения по умолчанию).
co_nlocals
Число локальных переменных (включая аргументы функции).
co_varnames
Кортеж, содержащий имена локальных переменных.
co_code
Строка, представляющая последовательность байт-компилированных инструкций.
co_consts
Кортеж, содержащий значения используемых литеральных выражений.
co_names
Кортеж всех используемых в байт-коде имен.
co_filename
Имя файла, из которого объект-код был скомпилирован.
co_firstlineno
Номер первой строки определения функции в файле.
co_lnotab
Строка, представляющая отображение смещения в байт-коде в номера строк (пустая строка, если включена оптимизация).
co_stacksize
Необходимый для выполнения размер стека (включая локальные переменные).
co_flags
Число, представляющее различные флаги интерпретатора. Для co_flags определены следующие биты (наиболее важные): бит 0x04 установлен, если функция
168 |
Глава 11. Встроенные типы данных |
использует запись ‘*args’ (воспринимает произвольное число позиционных аргументов); бит 0x08 установлен, если функция использует запись ‘**kwds’ (воспринимает произвольное число именованных аргументов).
Если объект кода представляет функцию, то первый элемент кортежа co_consts всегда является строкой документации (или None, если строка документации не определена).
11.9.2Кадр стека
Объект frame представляет кадр стека функции, “окружение”, в котором выполняются инструкции кода. Вы можете получить объект кадра стека через атрибут tb_frame объекта traceback (см. раздел 11.9.3). Объекты frame имеют следующие атрибуты (атрибутам f_trace, f_exc_type, f_exc_value и f_exc_traceback можно присвоить новое значение, остальные доступны только для чтения):
f_back
Ссылка на предыдущий кадр стека (то есть, если мы рассматриваем кадр стека функции func, то этот атрибут ссылается на кадр стека функции, вызвавшей функцию func) или None, если рассматриваемый кадр стека является последним (то есть относится не к функции, а к коду, исполняемому в глобальной области видимости).
f_code
Объект кода (см. раздел 11.9.1), который выполняется в рассматриваемом кадре стека.
f_locals
Словарь, используемый для поиска локальных имен.
f_globals
Словарь, используемый для поиска глобальных имен.
f_builtins
Словарь, используемый для поиска встроенных имен.
f_restricted
Флаг, указывающий на то, что функция выполняется в защищенном режиме.
f_lineno
Номер последней выполненной в рассматриваемом кадре стека строки.
f_lasti
Номер последней выполненной в рассматриваемом кадре стека инструкции байткода (может использоваться в качестве индекса для строки байт-кода объекта code).
11.9. Детали реализации |
169 |
f_trace
Функция, которая будет вызываться в начале каждой строки исходного кода, или None (используется отладчиком).
f_exc_type f_exc_value
f_exc_traceback
Эти атрибуты представляют последнее перехваченное в рассматриваемом кадре исключение.
11.9.3Объекты traceback
Объект traceback представляет путь, пройденный с момента генерации исключения до его перехвата. Таким образом, он создается при возникновении исключительной ситуации. Вы можете получить объект traceback в качестве третьего элемента кортежа, возвращаемого функцией sys.exc_info() (см. описание модуля sys). Если программа не содержит подходящего обработчика исключения, информация, хранящаяся в объекте traceback, выводится в стандартный поток ошибок. В интерактивном режиме объект traceback для последнего не перехваченного исключения доступен через переменную sys.last_traceback.
Объекты traceback имеют следующие атрибуты, доступные только для чтения:
tb_next
Ссылка на объект traceback, представляющий следующий уровень на пути в сторону кадра стека, в котором возникла исключительная ситуация, или None, если рассматриваемый объект представляет последний уровень.
tb_frame
Ссылка на кадр стека, представляющего текущий уровень.
tb_lineno
Номер строки (на текущем уровне), в которой возникла исключительная ситуация.
tb_lasti
Номер (на текущем уровне) инструкции байт-кода, которая привела к возникновению исключительной ситуации (может использоваться в качестве индекса для строки байт-кода объекта code).
Значения атрибутов tb_lineno и tb_lasti объекта traceback могут отличаться от значений атрибутов f_lineno и f_lasti объекта frame, если исключительная ситуация возникла в теле инструкции try без подходящей ветви except или имеющей ветвь finally.
![](/html/1319/244/html_G5lOt33H99.SxOE/htmlconvd-92eOgE170x1.jpg)
170
Глава 12
Встроенные функции
Существует некоторый набор функций, встроенных в интерпретатор и, таким образом, всегда доступных для использования. Ниже приведены все встроенные функции в алфавитном порядке.
__import__(name [, globals [, locals [fromlist]]])
Эта функция вызывается инструкцией import. Вы можете заменить ее другой функцией, имеющей совместимый с __import__() интерфейс для того, чтобы изменить семантику инструкции import. Чтобы получить представление как и зачем это следует делать, смотрите описание стандартных модулей ihooks и rexec. Обратите также внимание на встроенный модуль imp, в котором определены некоторые операции, полезные для написания собственной функции __import__.
Например, инструкция ‘import spam’ приводит к выполнению ‘__import__(’spam’, globals(), locals(), [])’, а инструкция ‘from spam.ham import eggs’ — к выполнению ‘__import__(’spam.ham’, globals(), locals(), [’eggs’])’. Несмотря на то, что locals() и [’eggs’] передаются в качестве аргументов, сама функция __import__() не устанавливает локальную переменную eggs. На самом деле, стандартная функция __import__() вообще не использует аргумент locals, а аргумент globals использует только для определения контекста инструкции import.
Если аргумент name задан в виде ’РБЛЕФ.НПДХМШ’ и список fromlist пустой, функция __import__() возвращает объект-модуль, соответствующий имени ’РБЛЕФ’ (часть имени name до первой точки), а не объект-модуль с именем name. Однако, если задан не пустой аргумент fromlist, функция __import__() возвращает объект-модуль, соответствующий имени name. Это сделано для совместимости байт-кода, сгенерированного для разных вариантов инструкции import: при использовании ‘import spam.ham.eggs’, объект модуль spam должен быть помещен в пространство имен, соответствующее области видимости, в котором выполняется инструкция import, в то время как при использовании ‘from spam.ham import eggs’, объект-модуль spam.ham должен быть использован для поиска объекта eggs. Для получения объекта Вы можете воспользоваться встроенной функцией getattr(), например:
import string
def my_import(name):