Форум сайта python.su
Здравствуйте. Есть следующий код:
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()
Офлайн
Я, конечно, могу ошибаться.
Но что, если для начала вам исправить предпоследнюю строку:
print(x)
Офлайн
Там всё правильно.
db2 - это объект наподобие встроенного типа dictionary, поэтому в последнем цикле переменной x последовательно присваиваются ключи, по которым осуществляется доступ к сохраненным объектам db2, и уже эти объекты передаются функции print.
Офлайн
Разобрался, в чем ошибка. Бесконечный цикл возникает внутри метода
class Manager: #... def __getattr__(self, attr): return getattr(self.person, attr);
class Manager: def __getattr__(self, attr): return getattr(object.__getattribute__(self, 'person'), attr) # вместо getattr(self.person, attr);
Офлайн
Вообще-то эту проблему принято решать через изменения __dict__ объекта
Офлайн