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

19.3. UserDict - интерфейсный класс для создания отображений 257

19.3 UserDict - интерфейсный класс для создания отображений

Этот модуль определяет интерфейсный класс, предназначенный для использования в качестве базового класса при определении отображений. Вы можете переопределять существующие методы и добавлять новые, таким образом изменяя поведение или добавляя новые возможности.

Модуль определяет единственное имя - класс UserDict:

UserDict( [initialdata])

Возвращает экземпляр класса, который ведет себя аналогично объектам встроенного типа dictionary (словарь). Экземпляр инициализируется данными, взятыми из initialdata (отображение произвольного типа). Если аргумент initialdata опущен, экземпляр изначально не содержит записей. Данные из initialdata копируются и сохраняются в виде словаря в атрибуте data созданного экземпляра.

В дополнение к методам и операциям, характерным для всех отображений (см. раздел 11.3), экземпляры класса UserDict имеют следующий атрибут:

data

Словарь, в котором хранятся данные.



Глава 20

Сохранение и копирование объектов

Модули, описанные в этой главе, предоставляют возможность сохранения и копирования объектов языка Python.

pickle Преобразует объекты языка Python в последовательность байтов и обратно.

cPickle Более быстрый вариант модуля pickle.

shelve Сохранение объектов в базе данных в стиле DBM.

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

struct Преобразование объектов в структуры языка C.

20.1 pickle и cPickle - представление объектов в виде последовательности байтов

Модуль pickle реализует простой, но мощный алгоритм "консервирования" (pickling, преобразования объектов в последовательность байтов) почти любых объектов языка Python с возможностью дальнейшего восстановления (unpickling). Однако этот модуль не заботится о сохранении имен объектов и не обеспечивает к ним совместный доступ. Полученную последовательность байтов Вы можете записать в файле, сохранить в базе данных или переслать по сети на другую машину. Модуль shelve предоставляет простой интерфейс для сохранения "законсервированных" объектов в базе данных в стиле

DBM.

В то время как реализованный на языке Python модуль pickle работает достаточно медленно, реализованный на C модуль cPickle работает иногда почти в 1000 раз быстрее. Модуль cPickle использует точно такой же алгоритм и имеет аналогичный интерфейс, за исключением того, что вместо классов Pickler и Unpickler используются функции, возвращающие объекты с аналогичным интерфейсом.

Хотя модули pickle и cPickle и используют внутри себя встроенный модуль marshal, они отличаются от этого модуля способом обработки данных:



20.1. pickle и cPickle - представление объектов в виде ... 259

• Модули pickle и cPickle отслеживают объекты, которые уже были обработаны, и никогда не обрабатывают их повторно. Это позволяет "консервировать" рекурсивные объекты (объекты, содержащие ссылки на себя), которые не могут быть обработаны модулем marshal . Аналогично обрабатываются совместно используемые объекты (различные объекты ссылаются на один и тот же объект): они остаются совместно используемыми, что очень важно для изменяемых объектов.

• Модуль marshal совсем не поддерживает экземпляры классов, в то время как модули pickle и cPickle позволяют с ними работать. Определение класса должно находиться в том же модуле, в котором оно было при "консервации" объекта.

Используемый формат данных характерен для языка Python и не имеет ограничений, характерных, например, для стандартного формата XDR (External Data Representation), который не позволяет представить совместное использование объектов. Однако это означает, что программы на других языках не смогут восстановить "законсервированный" объект.

По умолчанию для представления используются только печатные ASCII символы, что позволяет просматривать файл с данными с помощью обычного текстового редактора с целью отладки или восстановления данных. С другой стороны, такое представление занимает больше места, чем двоичный формат. Вы можете выбрать двоичный формат, используя ненулевое значение аргумента bin конструктора Pickler и функций dump() и dumps() .

Модули pickle и cPickle не поддерживают объекты кода. В этом нет большой необходимости, так как для "консервирования" объектов кода традиционно используется модуль marshal. Кроме того, это позволяет избежать возможного включения в файлы данных троянских коней.

Для удобства работы с долгоживущими модулями предоставляется поддержка ссылок на объекты, которые не подлежат "консервированию". Для таких объектов запоминается идентификатор, возвращаемый атрибутом-функцией или методом persistent id(). Идентификатор может быть произвольной строкой из печатных ASCII символов. Для восстановления объекта по идентификатору необходимо определить атрибут-функцию persistent load() .

На "консервирование" экземпляров классов есть несколько ограничений. Во-первых, класс должен быть определен в глобальном пространстве имен одного из модулей. Во-вторых, все переменные экземпляра (то есть атрибут dict ) должны поддерживать "консервацию" или же экземпляр класса должен иметь метод getstate () протокола копирования, возвращающий объект, который поддерживает "консервацию".

При восстановлении экземпляра класса его метод init () обычно не вызывается. Для того, чтобы он вызывался, класс должен иметь метод getinitargs () протокола копирования. Другие методы протокола копирования (см. раздел ??) getstate () и setstate () используются для сохранения и восстановления состояния объекта.



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