Сохранение экземпляров классов в хранилищах Python

sohranenie ekzemplyarov klassov v hranilishhah python Базы данных и постоянное хранение

Более полезным типом объектов, которые можно хранить в хранилищах, являются экземпляры классов. Поскольку в их атрибутах записывается состояние, а унаследованные методы определяют поведение, постоянно хранимые объекты классов, в сущности, выполняют роль как за пи сей базы данных, так и про грамм обработки баз данных. Для сериализации и сохранения экземпляров классов в плоских файлах и в других подобным им объектах (например, в сетевых сокетах) можно также использовать базовый модуль pickle, но высокоуровневый модуль shelve обеспечивает также возможность использовать доступ к хранилищу по ключу. Рассмотрим простой класс, представленный в примере 17.2, с помощью которого моделируются записи с информацией о сотрудниках гипотетического предприятия.

Пример 17.2. PP4E\Dbase\person.py (вер сия 1)

"объект с информацией о сотруднике: поля + поведение"

class Person:

def __init__(self, name, job, pay=0): self.name = name self.job = job

self.pay = pay # действительные данные экземпляра

def tax(self):

return self.pay * 0.25 # вычисляется при вызове

def info(self):

return self.name, self.job, self.pay, self.tax()

Ничто в этом классе не говорит о том, что его экземпляры будут использоваться в качестве записей в базе данных — его можно импортировать и использовать независимо от внешнего хранилища. Однако его удобно использовать для создания записей в базе данных: из этого класса можно создавать постоянно хранимые объекты, просто создавая экземпляры как обычно и сохраняя их по ключу в открытом хранилище shelve:

C:\\PP4E\Dbase> python

>   >> from person import Person

>   >> bob = Person(‘bob’, ‘psychologist’, 70000)

>   >> emily = Person(’emily’, ‘teacher’, 40000)

>>> 

>   >> import shelve

>   >> dbase = shelve.open(‘cast‘) # создать новое хранилище

>   >> for obj in (bob, emily): # сохранить объекты

dbase[obj.name] = obj # использовать значение name в качестве ключа …

>   >> dbase.close() # необходимо для bsddb

Здесь в качестве ключей в базе данных мы использовали атрибуты name экземпляров объектов. Когда позднее мы снова загрузим эти объекты в интерактивном сеансе Python или сценарии, они воссоздадутся в памяти в том виде, какой у них был в момент сохранения:

C:\\PP4E\Dbase> python

>   >> import shelve

>   >> dbase = shelve.open(‘cast’) # открыть хранилище

>>> 

>>> list(dbase.keys()) # в хранилище присутствуют оба объекта

[‘bob’, ’emily’]

>>> print(dbase[’emily’])

<person.Person object at 0x0197EF70>

>>> 

>>> print(dbase[‘bob’].tax()) # вызов: метода tax объекта с именем bob 17500.0

Обратите внимание, что вызов метода tax для объекта с именем «Bob» работает, несмотря на то, что мы не импортировали класс Person. Python достаточно сообразителен, чтобы снова связать объект с исходным классом после восстановления из сериализованной формы и сделать доступными все методы загруженных объектов.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий