The Python Language Reference / Справочник по языку Python: 3. Модель данных
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
object.__init__(self[, ...]) Hittih 22.07.10 в 07:08 |
|
|
Этот метод вызывается при создании соответствующего экземпляра. Его аргументами становятся те, которые были переданы выражению конструктору класса. Если в базовом классе определён метод "__init__()" , то метод "__init__()" производного класса (если определён) должен явно вызывать его, чтобы гарантировать правильную инициализацию части экземпляра, соответствующей базовому классу ( например : "BaseClass.__init__(self, [args...])" ) . Для конструкторов есть особый запрет - они не должны возвращать какого-либо значения - иначе вызывается ошибка "TypeError" . Hittih 22.07.10 в 07:03 |
||
|
object.__del__(self) Hittih 22.07.10 в 06:47 |
||
|
Этот метод (называемый также деструктор) вызывается, когда данный экземпляр должен быть уничтожен. Если в базовом классе определён метод "__del__()" , то метод "__del__()" производного класса (если определён) должен явно вызывать его, чтобы гарантировать правильное удаление части экземпляра, соответствующей базовому классу. Заметьте, что метод "__del__()" может (хотя это не рекомендуется) отложить удаление экземпляра, создав новую ссылку на него. Он может быть вызван потом, когда будет удалена эта новая ссылка. Не гарантируется, что методы "__del__()" будут вызваны для объектов, существующих на момент закрытия интерпретатора. Hittih 22.07.10 в 06:42 |
||
|
Замечание Hittih 23.07.10 в 08:54 |
||
|
«del x» лишь уменьшает на 1 счётчик ссылок на «x» , а не вызывает напрямую «x.__del__()» , который вызывается только когда счётчик ссылок достигает ноля. Среди ситуаций, при которых счётчик ссылок на объект не может обнулиться, самыми обычными являются : циклические ссылки между объектами (например, список с двухсторонними связями, или древовидная структура данных с указателями на родителя и потомка) ; ссылка на объект в кадре стека функции, которая получила исключение (раскрутка стека, содержащаяся в «sys.exc_info()[2]» , имея ссылку на этот кадр стека, не даёт его уничтожить) ; или ссылка на объект в том кадре стека, в котором произошло необработанное исключение в интерактивном режиме (раскрутка стека, содержащаяся в «sys.last_traceback» , имея ссылку на этот кадр стека, не даёт его уничтожить) . Первая ситуация может быть исправлена только путем явного разрывания цикла, а две последние ситуации могут быть решены путём записи «None» в «sys.last_traceback» . Циклические ссылки, являющиеся «мусором» , детектируются если включена опция обнаружения циклов (по умолчанию включена) , но могут быть удалены только если не задействованы методы Питоновского уровня «__del__()» . Обратитесь к документации модуля «gc» за более подробной информацией о том, как детектор циклов обращается с методами «__del__()» , в частности описание значения у «garbage» . Hittih 23.07.10 в 08:49 |
||
|
Предостережение Hittih 23.07.10 в 08:55 |
||
|
По причине ненадёжной ситуации, в которой вызываются методы «__del__()» , исключения, возникающие при их исполнении, игнорируются, и вместо этого печатаются предупреждения в «sys.stderr» . Также, когда «__del__()» вызывается для удаления модуля (например, когда исполнение программы завершено) , глобальные переменные, на которые ссылается метод «__del__()» , могут уже быть удалены или в процессе удаления (например, отключение механизма импорта) . По этой причине методам «__del__()» следует производить самый минимум необходимого для поддержания ???????????? . Начиная с версии 1.5 , Питон гарантирует, что глобальные переменные, чьё имя начинается с одиночного подчёркивания, будут удалены из их модуля до удаления остальных глобальных переменных. Если нет других ссылок на такие глобальные переменные, то это может помочь убедиться, что импортированные модули ещё доступны в то время, когда вызывается метод «__del__()» . Hittih 23.07.10 в 10:11 |
||
|
object.__repr__(self) Hittih 09.08.10 в 21:38 |
||
|
Вызывается встроенной функцией «repr()» для вычисления «официального» текстового представления (текстовый объект) для исходного объекта. В тех случаях, когда это вообще возможно – это текст должен быть правильным выражением на Питоне, который, при его интерпретации, даст обратно объект с тем же значением (при условии такого же окружения) . А когда это не возможно – будет возвращён текст вида : <…полезное описание…> . Если в классе определён «__repr__()» , но не определён «__str__()» , то «__repr__()» используется также и вместо «__str__()» . Hittih 09.08.10 в 21:37 |
||
|
Это обычно используется для отладки, поэтому важно, чтобы это представление было информационно богатыми и недвусмысленным. Hittih 09.08.10 в 21:49 |
||
|
object.__str__(self) Hittih 09.08.10 в 21:49 |
||
|
Вызывается встроенной функцией «str()» и функцией «print()» для вычисления «неформального» текстового представления (текстовый объект) для исходного объекта. Отличается от «__repr()__» тем, что не обязан выдавать правильное выражение на Питоне, вместо этого может выдать более удобный или лаконичный текст. Hittih 09.08.10 в 22:11 |
||
|
object.__format__(self, format_spec) Hittih 09.08.10 в 22:13 |
||
|
Вызывается встроенной функцией «format()» для получения «форматированого» текстового представления (текстовый объект) для исходного объекта. Аргумент «format_spec» является строкой, содержащей описание требуемых опций форматирования. Интерпретация этого аргумента полагается на реализацию метода «__format__()» у соответствующего типа, хотя большинство классов будут перепоручать форматирование одному из встроенных типов, или использовать аналогичный синтаксис опций форматирования. Hittih 09.08.10 в 23:21 |
||
|
Описание стандарта синтаксиса форматирования смотрите в <a href="http://docs.python.org/py3k/library/string.html#formatspec">Format Specification Mini-Language</a>. Hittih 02.02.11 в 16:00 |
||
|
- Hittih 09.08.10 в 23:23 |
+1 | |
|
object.__lt__(self, other) Hittih 09.08.10 в 23:27 |
||
|
object.__le__(self, other) Hittih 09.08.10 в 23:27 |
||
|
object.__eq__(self, other) Hittih 09.08.10 в 23:28 |
||
|
object.__ne__(self, other) Hittih 09.08.10 в 23:28 |
||
|
object.__gt__(self, other) Hittih 09.08.10 в 23:28 |
||
|
object.__ge__(self, other) Hittih 09.08.10 в 23:28 |
||
|
Это так называемые методы «расширенного сравнения» («rich comparison») . Соответствие между символами операторов и именами методов такое : «x<y» вызывает «x.__lt__(y)» , «x<=y» вызывает «x.__le__(y)» , «x==y» вызывает «x.__eq__(y)» , «x!=y» вызывает «x.__ne__(y)» , «x>y» вызывает «x.__gt__(y)» , «x>=y» вызывает «x.__ge__(y)» . Hittih 10.08.10 в 00:02 |
||
|
Метод расширенного сравнения может возвращать синглтон «NotImplemented» , если в нём не реализована операция сравнения для данной пары аргументов. По соглашению – в случае успешных сравнений возвращается «False» или «True» . Однако, эти методы могут возвращать любое значение – так что, если эти операторы сравнения используются там, где требуется логический (булев) результат (например условие инструкции «if» ) , то Питон применит «bool()» к этим значениям (чтобы привести их к булеву типу) . Hittih 30.08.10 в 11:30 |
||
|
Нет неявно подразумеваемых соотношений между операторами сравнения. Истинность «x==y» не означает, что «x!=y» ложно. Таким образом, определяя «__eq__()» , следует также определить «__ne__()» –только тогда операторы будут вести себя, как ожидалось. Смотрите в пункте о «__hash__()» некоторые важные замечания о создании хэшируемых объектов, которые поддерживают пользовательские операции сравнения и могут использоваться в качестве ключей словаря. Hittih 30.08.10 в 12:08 |
||
|
Для этих методов нету реализации автоматической замены порядка аргументов (когда левый аргумент не поддерживает данную операцию, а правый поддерживает) . Но, вместо этого можно воспользоваться тем, что «__lt__()» с «__gt__()» , «__le__()» с «__ge__()» , «__eq__()» с «__ne__()» являются противоположностями друг друга (попарно) . Hittih 30.08.10 в 13:22 |
||
|
Для аргументов расширенных сравнений никогда не производится приведение типов. Hittih 02.02.11 в 16:13 |
||
|
Об автоматической генерации операций сравнения на основе одной операции смотрите <a href="http://code.activestate.com/recipes/576529/"> Total Ordering recipe in the ASPN cookbook</a>. Hittih 30.08.10 в 14:39 |
||
|
object.__hash__(self) Hittih 30.08.10 в 14:40 |
||
|
Вызывается встроенной функцией «hash()» и для операций над членами хэшируемых коллекций, включая «набор» («set») , «фиксированный набор» («frozenset») и «словарь» («dict») . Метод «__hash__()» должен возвращать целое число. Единственным обязательным свойством является то, что равные объекты имеют одинаковое значение хэша. …………… Hittih 30.08.10 в 15:02 |
||
|
Если класс не определяет метод «__eq__()» , то он не должен определять метод «__hash__()» , а если он определяет «__eq__()» , но не определяет «__hash__()» , то его экземпляры не смогут быть использованы как элементы хэшируемых множеств. Если класс определяет изменяемые объекты и реализует метод «__eq__()» , то он не должен реализовывать «__hash__()» , поскольку реализация хэшируемых множеств требует, чтобы значение хэша ключей было неизменяемым (если значение хэша ключа объекта изменяется, то оно может оказаться не в своей группе хэшей («hash bucket») (и будет пропущено при поиске) ) . Hittih 17.09.10 в 00:56 |
||
|
Определяемые пользователем классы по умолчанию имеют методы «__eq__()» и «__hash__()» , из-за которых все объекты экземпляров этих классов являются неравными друг другу (они равны только сами себе) , а «x.__hash__()» возвращает «id(x)» . Hittih 17.09.10 в 01:21 |
||
|
Классы, которые наследуют метод «__hash__()» из родительского класса, но изменяют значение «__eq__()» так, что возвращаемое значение хэша уже теряет разумный смысл (например, переходя к концепции сравнения на основании значения вместо стандартного сравнения на основе уникальных идентификаторов) могут явным образом обозначить себя как нехэшируемые установив «__hash__ = None» в определении класса. Такое действие приведёт не только к тому, что экземпляры данного класса будут вызывать соответствующее исключение «TypeError» , когда программа попытается получить их значение хэша, но и к тому, что экземпляры будут правильно идентифицированы как нехэшируемые при проверке «isinstance(obj, collections.Hashable)» (в отличие от классов, которые определили собственный «__hash__()» , явно вызывающий исключение «TypeError» ) . Hittih 17.09.10 в 02:26 |
||
|
Если классу, переопределившему «__eq__()» нужно оставить реализацию «__hash__()» из родительского класса, то это нужно обязательно делать явным образом : «__hash__ = .__hash__» . Иначе наследование «__hash__()» будет блокировано, так же, как если бы «__hash__» был явно установлен в «None» . Hittih 17.09.10 в 03:00 |
||
|
object.__bool__(self) Hittih 17.09.10 в 03:02 |
||
|
Вызывается для реализации проверки значения на истинность и встроенной операции «bool()» . Должен возвращать «False» или «True» . Если этот метод не определён, то вызывается «__len__()» , если тот определён, и, если результат ненулевой, то данный объект считается значащим «True» . Если класс не определяет ни «__len__()» , ни «__bool__()» , то его экземпляры считаются значащими «True» . Hittih 17.09.10 в 03:25 |
||
|
3.3.2. Настройка (обработка) доступа к атрибутам Hittih 18.09.10 в 04:15 |
||
|
object.__getattr__(self, name) Hittih 18.09.10 в 04:15 |
||
|
Вызывается, когда искомый атрибут не найден в соответствующих местах (тоесть, он не является атрибутом экземпляра и не найден в дереве классов данного экземпляра) . «name» – имя атрибута. Этот метод должен возвращать значение (вычисленное) атрибута, или инициировать исключение «AttributeError» . Hittih 18.09.10 в 04:29 |
||
|
Заметьте, что если атрибут найден обычным способом, то «__getattr__()» не вызывается. (Несимметричность в этом смысле между «__getattr__()» и «__setattr__()» создана намеренно. ) Это сделано и в целях эффективности и из-за того, что иначе у «__getattr__()» не было бы никакой возможности доступа к другим атрибутам экземпляра. Кстати, по крайней мере для переменных экземпляра вы можете имитировать тотальный контроль за счёт непомещения их в словарь атрибутов данного экземпляра (а храня их в другом объекте) . Смотрите метод «__getattribute__()» ниже, предоставляющий способ действительно полностью контролировать доступ к атрибутам. Hittih 18.09.10 в 04:50 |
||
|
object.__getattribute__(self, name) Hittih 18.09.10 в 04:54 |
||
|
Вызывается безусловно (всегда, когда определён) для реализации доступа к атрибутам экземпляров данного класса. Если в классе также определён «__getattr__()» , то он не будет вызван, если только «__getattribute__()» не вызовет его явно или не инициирует исключение «AttributeError» . Этот метод нужен, чтобы возвращать значение (вычисленное) атрибута, или инициировать исключение «AttributeError» . Чтобы при доступе к нужным атрибутам избежать бесконечной рекурсии, в реализации этого метода всегда нужно вызывать метод базового класса с тем же именем, например, «object.__getattribute__(self, name)» (вместо «self.name») . Hittih 18.09.10 в 05:14 |
||
|
Замечание Hittih 18.09.10 в 05:15 |
||
|
Этот метод всё же может быть обойдён обращением к специальным методам в результате явного обращения с помощью специального синтаксиса языка или встроенных функций. Смотрите «Обращение к специальным методам» . Hittih 18.09.10 в 05:21 |
||
|
object.__setattr__(self, name, value) Hittih 18.09.10 в 05:21 |
||
|
Вызывается при попытке записи (назначения) атрибута. Он вызывается вместо стандартного механизма (тоесть, вместо сохранения значения в словаре экземпляра) . «name» – имя атрибута, «value» – значение, которое нужно под этим именем сохранить (назначить) . Hittih 18.09.10 в 05:29 |
||
|
Если «__setattr__()» хочет получить доступ к атрибуту экземпляра, ему следует вызывать метод базового класса с тем же именем, например, «object.__setattr__(self, name, value)» (вместо «self.name») . Hittih 18.09.10 в 05:34 |
||
|
object.__delattr__(self, name) Hittih 18.09.10 в 05:34 |
||
|
Подобен «__setattr__()» , только вместо назначения – удаляет атрибут. Реализовывать его следует только если «del obj.name» должен иметь какой-то специальный смысл для данного объекта. Hittih 18.09.10 в 05:41 |
