import shelve class Person: def __init__(self, name, job=None, pay = 0): self.name = name self.job = job self.pay = pay def __str__(self): return "[Person: %s, %s]" % (self.name, self.pay) class Manager: def __init__(self, name, pay): self.person = Person(name, 'mgr', pay) def __getattr__(self, attr): return getattr(self.person, attr); def __str__(self): return str(self.person) # создание объектов sue = Person('Sue Jackson') michael = Person('Michael Wilson', 'dev', 19000) john = Manager('John Smith', 50000) # запись объектов в хранилище db = shelve.open('persondb') for x in (sue, michael, john): db[x.name] = x db.close() # проверка корректности записи db2 = shelve.open('persondb') for x in db2: print(db2[x]) db2.close()
При выводе информации об объекте класса Manager появляется ошибка:
Traceback (most recent call last):
File “C:\Python34\lib\shelve.py”, line 111, in __getitem__
value = self.cache
KeyError: ‘John Smith’
Если убрать из класса Manager вызовы методов getattr(self.person, attr) и str(self.person), то код выполняется без ошибок. Но мне нужно, чтобы сохранялись и воспроизводились объекты, поддерживающие делегирование. Это вообще осуществимо?