Анимация
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

if sys.hexversion<0x020000F0:

# Эти методы не будут определены, если

# используется версия 2.0 (финальная) или новее def getslice (self, i, j):

return self[max(0, i):max(0, j):] def setslice (self, i, j, seq):

self[max(0, i):max(0, j):] = seq def delslice (self, i, j):

del self[max(0, i):max(0, j):]

Обратите внимание на использование функции max() . В то время как методы

*item () всегда получают индексы без изменений, перед вызовом методов

*slice () к отрицательным индексам добавляется длина последовательности. После такого преобразования индекс может остаться отрицательным и быть неверно интерпретирован метами *item (). Использование max(0, i) гарантирует, что индексы всегда будут интерпретироваться корректно.

getslice ( self, i, j)

Вызывается для реализации получения подпоследовательности (self[ i: j] ).

setslice (self, i, j, sequence)

Вызывается для реализации присваивания срезу, то есть замены подпоследовательности (self[ i: j] = sequence ).

delslice ( self, i, j)

Вызывается для реализации удаления подпоследовательности (del self[ i: j] ).

Для реализации операций, касающихся расширенной записи срезов, используются методы getitem () , setitem () и delitem () . В этом случае в качестве ключа выступает объект типа slice, объект Ellipsis или кортеж из них (см. раздел 11.8.3). Если вы реализовали поддержку расширенной записи среза, то, начиная с версии 2.0, нет необходимости реализовывать методы getslice () , setslice () и delslice () : при их отсутствии автоматически будет вызван метод method getitem (), setitem () или delitem ().

Следующий пример показывает, как Вы можете сохранить возможность работы Вашей программы (модуля) со старыми версиями интерпретатора (предполагается, что методы method getitem (), setitem () или delitem () поддерживают объекты, представляющие срез, в качестве аргумента):

class MyClass:

def getitem (self, item):

def setitem (self, item, value):

def delitem (self, item):



Приведение объектов к базовым типам

В этом разделе описаны специальные методы, реализующие приведение объектов к строковому и числовым типам. Для того, чтобы объект можно было привести к встроенным типам последовательностей, достаточно определить специальные методы len () и getattr () (см. раздел 11.6.3).

Строковое представление

repr ( self)

Вызывается встроенной функцией repr() и при использовании обратных кавычек (expr) (а также функцией str() и инструкцией print, если метод

str () не определен) для получения формального строкового представления объекта. Обычно такое представление должно выглядеть как выражение языка Python, пригодное для создания объекта с тем же самым значением. По традиции, объекты, для которых нельзя получить такое строковое представление достаточно простым способом, дают строку вида <полезная информация> (представление такого вида будет получено для экземпляра класса, если он не имеет метода

repr () ).

str ( self)

Вызывается встроенной функцией str() , инструкцией print и оператором форматирования с символом формата s для получения строкового представления, наиболее пригодного для вывода.

oct ( self) hex ( self)

Вызываются для реализации встроенных функций oct() и hex() соответственно. Должны возвращать строковое значение.

Приведение к числовым типам

Оператор in реализуется путем перебора элементов последовательности и сравнения их с искомым значением. Однако для некоторых последовательностей его можно реализовать более эффективно. Для этих целей в версии 1.6 добавлен еще один специальный метод:

contains ( self, item)

Вызывается для реализации операторов in и not in ( item in self , item not in self ). До версии 1.6, а также если метод contains не определен, для реализации этих операторов используется последовательный перебор элементов последовательности и сравнение их с искомым значением. Операторы in и not in всегда возвращают 0 или 1 , определяющие истинность возвращаемого методом contains объекта (см. раздел 10.2.5).



Арифметические и битовые операции

Определение описанных в этом разделе методов позволит производить над объектами соответствующие арифметические и битовые операции привычным способом, то есть, используя операторы и встроенные функции.

Унарные операции

neg ( self) pos ( self) invert ( self)

abs ( self)

Вызывается для реализации унарных операторов -, +, ~ и встроенной функции

abs() .

Бинарные операции

Для того, чтобы вычислить выражение x op y, предпринимаются следующие шаги

( op () и rop () - методы, реализующие оператор op, например, add ()

и radd () реализуют оператор +):

1. Если x является строкой и op является оператором форматирования (%), выполняется форматирование и все остальные шаги пропускаются.

2. Если x является экземпляром класса:

(a) Если для x определен метод coerce (), x и y заменяются значениями, содержащимися в кортеже x. coerce (y); если же метод

coerce () возвращает None, перейти к пункту 3.

(b) Если после преобразований ни x, ни y не является экземпляром, перейти к пункту 4.

(c) Если для x определен метод op , вернуть x. op (y), в противном

случае восстановить значения x и y, которые были перед выполнением пункта

complex ( self) int ( self)

long (self)

float ( self)

Вызывается при использовании встроенных функций complex() , int() , long() , и float() , а также оператора форматирования с символами формата, отличными от s . Должны возвращать значение соответствующего типа.



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