10.1 Vai ser do meu jeito!
Às vezes, seus objetos armazenam muitas referências para vários objetos de serviço que você não quer transmitir pela rede, ou que não podem ser transmitidos pela rede: referências a arquivos, bancos de dados, etc.
Para que a serialização funcione nesses casos, deram aos classes
a capacidade de gerenciar sua própria serialização. Para isso,
são usados métodos especiais: __reduce__()
,
__getstate__()
, __setstate__()
. Esses métodos
permitem especificar como os objetos devem ser serializados e
restaurados.
Métodos principais de serialização controlada:
-
__reduce__()
: Especifica como o objeto deve ser serializado. -
__getstate__()
: Retorna o estado do objeto para serialização. -
__setstate__(self, state)
: Restaura o objeto a partir do estado.
Vou te contar mais sobre eles e como usá-los juntos.
10.2 Método __reduce__()
Método __reduce__()
retorna uma tupla,
que especifica como o objeto deve ser serializado e
desserializado. A tupla geralmente contém:
- A referência a uma função ou classe que será usada para restaurar o objeto.
- Tupla de argumentos para essa função ou classe.
- Estado adicional do objeto (se necessário).
Exemplo:
import pickle
class CustomClass:
def __init__(self, value):
self.value = value
def __reduce__(self):
return (self.__class__, (self.value,))
def __repr__(self):
return f"CustomClass(value={self.value})"
# Criar um objeto
obj = CustomClass(42)
# Serializar o objeto
serialized_obj = pickle.dumps(obj)
print("Objeto serializado:", serialized_obj)
# Desserializar o objeto
deserialized_obj = pickle.loads(serialized_obj)
print("Objeto desserializado:", deserialized_obj)
Por padrão, a função __reduce__()
tem o seguinte comportamento:
class CustomClass:
def __init__(self, value):
self.value = value
def __reduce__(self):
# Definir classe
cls = self.__class__
# Argumentos do construtor
args = (self.value,)
# Estado do objeto
state = self.__dict__
return (cls, args, state)
Ela retorna uma tupla composta por três objetos:
Referência para a classe atual
Argumentos do construtor (tupla)
Referência para o estado atual do objeto
Se esse comportamento te atende — __reduce__()
não precisa ser
sobrescrito.
10.3 Leitura e escrita de estado
Métodos __getstate__()
e
__setstate__()
Esses métodos são usados para gerenciar o estado do objeto durante a serialização e desserialização.
-
__getstate__()
: Retorna o estado do objeto, que deve ser serializado. -
__setstate__(self, state)
: Restaura o objeto a partir do estado.
Exemplo:
Suponha que queremos salvar não todos os campos do objeto, mas excluir
alguns deles. Para isso, no método __getstate__()
, você precisa:
-
Copiar o estado atual do objeto (definido pelo campo de serviço
__dict__
) para uma variável separada — um dicionáriostate
. - Excluir dele todos os campos que não devem ser serializados.
- Retornar o objeto obtido como resultado da função
__getstate__()
.
import pickle
class CustomClass:
def __init__(self, value):
self.value = value
self.internal_state = "internal"
def __getstate__(self):
state = self.__dict__.copy()
del state['internal_state'] # Excluir estado interno
return state
def __setstate__(self, state):
self.__dict__.update(state)
self.internal_state = "restored internal" # Restaurar estado interno
def __repr__(self):
return f"CustomClass(value={self.value}, internal_state={self.internal_state})"
# Criar um objeto
obj = CustomClass(42)
print("Objeto original:", obj)
# Serializar o objeto
serialized_obj = pickle.dumps(obj)
print("Objeto serializado:", serialized_obj)
# Desserializar o objeto
deserialized_obj = pickle.loads(serialized_obj)
print("Objeto desserializado:", deserialized_obj)
Ao desserializar, na função __setstate__()
, fazemos duas coisas:
-
Atualizamos o estado atual do objeto com o método
update()
. -
O campo
internal_state
(e outros campos não serializáveis) recebem novos valores.
GO TO FULL VERSION