Подтвердить что ты не робот

Как остановить атрибуты от маринования в Python

Я использую gnosis.xml.pickle для преобразования объекта моего собственного класса в xml. Объект инициализируется так, что:

self.logger = MyLogger()

Но когда я удаляю объект в строку, я получаю исключение, заявляя, что pickler столкнулся с нераспадаемым типом (thread.lock).

Есть ли способ "пометить" атрибут журнала, чтобы pickler знал, что не попробовать и рассортировать этот атрибут?

4b9b3361

Ответ 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)