CodeGym /Curso Java /Python SELF PT /Controle de Serialização

Controle de Serialização

Python SELF PT
Nível 22 , Lição 2
Disponível

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:

  1. Copiar o estado atual do objeto (definido pelo campo de serviço __dict__) para uma variável separada — um dicionário state.
  2. Excluir dele todos os campos que não devem ser serializados.
  3. 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:

  1. Atualizamos o estado atual do objeto com o método update().
  2. O campo internal_state (e outros campos não serializáveis) recebem novos valores.
1
Опрос
Trabalhando com Diretórios,  22 уровень,  2 лекция
недоступен
Trabalhando com Diretórios
Trabalhando com Diretórios
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION