Cómo evitar que los atributos se decapen en Python

Estoy usando gnosis.xml.pickle para convertir un objeto de mi propia clase a xml. El objeto se inicializa de modo que:

self.logger = MyLogger() 

Pero cuando vuelco el objeto a una cadena, obtengo una excepción que indica que el pickler encontró un tipo ineludible (thread.lock).

¿Hay alguna forma de “etiquetar” el atributo del registrador para que el recolector sepa que no intentará declinar ese atributo?

Puede definir dos métodos, __getstate__ y __setstate__ , para anular el comportamiento de decapado predeterminado.

http://docs.python.org/library/pickle.html#object.__getstate__

__getstate__ debería devolver un dictado de los atributos que desea conservar.

 def __getstate__(self): d = dict(self.__dict__) del d['logger'] return d 

__setstate__ debe configurar su objeto con el __setstate__ proporcionado.

 def __setstate__(self, d): self.__dict__.update(d) # I *think* this is a safe way to do it 

Tenga en cuenta que __init__ no se llamará cuando se deshaga, por lo que tendrá que crear su registrador en __setstate__

Esta podría ser una mejor solución ya que permitirá que un objeto creado a través de copy.deepcopy todavía tenga un self.logger :

 def __getstate__(self): d = self.__dict__.copy() if 'logger' in d: d['logger'] = d['logger'].name return d def __setstate__(self, d): if 'logger' in d: d['logger'] = logging.getLogger(d['logger']) self.__dict__.update(d) 

Su clase puede implementar el método especial __getstate__ para devolver exactamente qué partes de una instancia quiere que se decapen.

Hay varias variantes posibles en eso (aunque __getstate__ y su método complementario opcional __setstate__ son los más generales); consulte la página de documentos en línea de Python para obtener más información, que ya __getstate__ anteriormente porque es la que documenta __getstate__ .