Анимация
JavaScript
|
Главная Библионтека Доступ к атрибутам Вы можете изменить действия, выполняемые при доступе к атрибутам: получении значения, присваивании и удалении. Для повышения производительности эти методы кэширу-ются в объекте-классе в момент выполнения определения класса. Поэтому их изменение после выполнения определения класса не даст желаемого результата. getattr ( self, name) Вызывается, если атрибут не доступен обычным способом (то есть экземпляр, класс, экземпляром которого он является, и все его родительские классы не имеют атрибута с именем name). Метод должен возвращать значение (вычисленное) атрибута или генерировать исключение AttributeError. Обратите внимание, что в отличие от setattr () и delattr () , метод getattr () не вызывается, если атрибут найден обычным способом. Такой вариант эффективней и позволяет получить доступ из этих методов к другим атрибутам. классов и при этом для первого операнда не определен метод cmp (). Должен возвращать целое число: отрицательное, если self > other, ноль, если self == other, и положительное целое число, если self < other. Нет смысла определять cmp(y, x) отличным от -cmp(x, y), поэтому метод rcmp () обычно определяют в виде: def rcmp (self, other): return -cmp(self, other) hash (self) Метод предназначен для получения хэш-значения объекта. Вызывается для объектов, используемых в качестве ключа при операциях над словарями, а также при использовании встроенной функции hash() . Должен возвращать 32-битное целое число. Объекты, которые при сравнении считаются равными, должны иметь равные хэш-значения. Рекомендуется использовать своего рода смесь (используя, например, исключающее ИЛИ) хэш-значений компонентов объекта, играющих роль при сравнении. Если для класса не определен метод cmp () , то по умолчанию в качестве хэш-значения для его экземпляров будет использоваться идентификатор объекта, определение же метода hash () лишь замедлит выполнение программы. Если же у класса есть метод cmp () , но нет метода hash () , его экземпляры не могут быть использованы в качестве ключа в операциях над словарями. Хэш-значение должно быть постоянно на протяжении всего времени жизни объекта, поэтому изменяемые объекты не должны иметь метода hash () . nonzero ( self) Вызывается для определения истинности объекта, должен возвращать 0 или 1 . Если этот метод не определен, используется метод len () (см. раздел 11.6.3); если же для класса не определен ни один из этих методов, все его экземпляры будут истинными. Операция вызова call (self [, args...]) Вызывается при вызове экземпляра класса, то есть x(arg1, arg2, ...) является короткой записью дляx. call (arg1, arg2, ...). Эмуляция последовательностей и отображений Для того, чтобы определенные Вами объекты вели себя так же, как и встроенные типы string, tuple, list и dictionary, для них необходимо определить методы, описанные в этом разделе. Разница между последовательностями и отображениями заключается в том, что для последовательностей допустимыми ключами (индексами) являются целые числа k, такие что 0 <= k < N, где N - длина последовательности. Для отображений же ключом может являться объект любого типа10. Кроме того, при применении к последовательности операции среза, в качестве ключа выступает объект, представляющий один (объект типа slice или ellipsis) или несколько (кортеж из объектов типа slice и ellipsis) срезов (см. раздел 11.8.3). Кроме описанных здесь методов, для отображений рекомендуется реализовать методы keys() , values() , items() , has key() , get() , clear() , copy() , и update() , ведущие себя так же, как и для объектов dictionary (см. раздел 11.3); для изменяемых последовательностей следует реализовать методы, характерные для объектов list: append() , count() , index() , insert() , pop() , remove() , reverse() и sort() (см. раздел 11.2.6). И, наконец, специальные методы add (), radd () , iadd () , mul () , rmul () и imul () , реализующие характерные для последовательностей операции сложения (объединение последовательностей) и умножения (размножение последовательностей), описаны в разделе 11.6.3. Для совместимости с предыдущими версиями, могут быть определены специальные ме- 10Тип dictionary налагает дополнительные ограничения: для его ключа должна быть определена операция получения хэш-значения (см. описание встроенной функции hash() в главе 12). setattr (self, name, value) Вызывается при попытке присваивания атрибуту вместо обычного механизма, который сохраняет значение в словаре dict экземпляра. name - имя атрибута, value - присваиваемое значение. Обратите внимание, что попытка присвоить значение атрибуту экземпляра (например, setattr(self, name, value) ) внутри метода setattr () приведет к его рекурсивному вызову. Вместо этого следует добавить соответствующую запись в словарь атрибутов экземпляра: self. dict [name] = value. delattr ( self, name) Вызывается при попытке удаления атрибута. Этот метод следует определять только в том случае, когда для объектов имеет смысл инструкция del self .name. len ( self) Вызывается для реализации встроенной функции len() . Возвращаемое значение должно быть целым числом, большим или равным нулю. Кроме того, если для объекта не определен метод nonzero (), истинность объекта определяется по значению, возвращаемому методом len () . getitem (self, key) Вызывается для реализации получения элемента по индексу или ключу (self [key]). Интерпретация отрицательных индексов (если Вы реализуете последовательность) должна производиться самим методом getitem () . Если key имеет несоответствующий тип, следует генерировать исключение TypeError. Если Вы эмулируете последовательность, то, в случае выхода индекса за пределы допустимых значений (с учетом преобразований отрицательных индексов), метод должен генерировать исключение IndexError (таким образом при переборе элементов последовательности определяется ее конец). Если отображение не содержит записи с ключом key, принято использовать исключение KeyError. setitem (self, key, value) Вызывается для реализации присваивания элементу с заданным ключом или индексом (self [key] = value). Этот метод необходим только для отображений, допускающих изменение значения, соответствующего определенному ключу, или добавление записи с новым ключом, а также для последовательностей, допускающих изменение элементов. Если Вы эмулируете последовательность, то, в случае выхода индекса за пределы допустимых значений (с учетом преобразований отрицательных индексов), следует генерировать исключение IndexError. delitem ( self, key) Вызывается для реализации удаления элемента с заданным индексом или ключом ( del self[ key] ). Этот метод необходим только для последовательностей и отображений, допускающих удаление элементов. Соглашения об использовании исключений такие же, как и для метода getitem . До версии 2.0, для того, чтобы последовательность поддерживала операцию с простой записью среза, необходимо было определить следующие три метода (для неизменяемых последовательностей нужен только метод getslice () ). Для всех трех методов опущенные значения индексов i и j заменяются на ноль и sys.maxint соответственно. Если в записи среза используются отрицательные индексы, к ним добавляется длина последовательности. Если же метод len () не реализован, генерируется исключение AttributeError. Заметим, что нет никакой гарантии того, что после добавления длины последовательности индекс не будет отрицательным. Индексы, превышающие длину последовательности, остаются неизменными. Обратите внимание, что эти методы используются только для реализации операций с простой записью среза. тоды getslice () , setslice () и delslice () (см. ниже), которые будут обрабатывать операции с простой (но не расширенной) записью среза. 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 |