Пример 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