Как остановить атрибуты от маринования в Python
Я использую gnosis.xml.pickle для преобразования объекта моего собственного класса в xml. Объект инициализируется так, что:
self.logger = MyLogger()
Но когда я удаляю объект в строку, я получаю исключение, заявляя, что pickler столкнулся с нераспадаемым типом (thread.lock).
Есть ли способ "пометить" атрибут журнала, чтобы pickler знал, что не попробовать и рассортировать этот атрибут?
Ответы
Ответ 1
Вы можете определить два метода: __getstate__
и __setstate__
для вашего класса, чтобы переопределить поведение по умолчанию.
http://docs.python.org/library/pickle.html#object.__getstate__
__getstate__
должен возвращать атрибут, который вы хотите рассортировать.
def __getstate__(self):
d = dict(self.__dict__)
del d['logger']
return d
__setstate__
должен настроить ваш объект с предоставленным dict.
def __setstate__(self, d):
self.__dict__.update(d) # I *think* this is a safe way to do it
Обратите внимание, что __init__
не будет вызываться при рассылке, поэтому вам нужно будет создать свой журнал в __setstate__
Ответ 2
Ваш класс может реализовать специальный метод __getstate__
, чтобы точно указать, какие части экземпляра он хочет мариновать.
Существует несколько возможных вариантов (хотя __getstate__
и его дополнительный метод-компаньон __setstate__
являются наиболее общими) - см. онлайн-страницу документа Python для pickle
, к которой я уже указал выше, потому что она документирование __getstate__
.
Ответ 3
Это может быть лучшим решением, так как это позволит объекту, созданному с помощью copy.deepcopy, по-прежнему иметь self.logger
def __getstate__(self):
d = self.__dict__.copy()
if 'logger' in d.keys()
d['logger'] = d['logger'].name
return d
def __setstate__(self, d):
if 'logger' in d.keys():
d['logger'] = logging.getLogger(d['logger'])
self.__dict__.update(d)