Sérialisation d'objets personnalisés avec pickle

La sérialisation d’objets personnalisés avec pickle permet de convertir des objets Python, y compris des objets personnalisés (par exemple, des classes définies par l’utilisateur), en un format binaire qui peut être sauvegardé dans un fichier. Ensuite, cet objet peut être facilement désérialisé (chargé) pour être utilisé à nouveau dans une autre session.

Fonctions :

  • pickle.dump()

    Cette fonction permet de sérialiser un objet Python et de l'écrire dans un fichier. Cela peut être utile pour sauvegarder des objets complexes, tels que des instances de classe, pour les recharger plus tard.

    Importation :

    import pickle

    Attributs :

    Paramètre Type Description Valeur par défaut
    object object L'objet Python à sérialiser (peut être une instance de classe, liste, dictionnaire, etc.). None
    file file-like object Le fichier ou le flux dans lequel l'objet sera sérialisé (généralement ouvert en mode binaire 'wb'). None
    protocol int, optionnel (Optionnel) Le protocole de sérialisation. Par défaut, c'est le plus compatible. None

    Exemple de code :

    import pickle
    
    # Création d'une classe personnalisée
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    # Instanciation d'un objet
    person = Person("Alice", 30)
    
    # Sérialisation de l'objet dans un fichier
    with open('person.pkl', 'wb') as file:
        pickle.dump(person, file)

    Explication du code :

    1. Nous définissons une classe Person avec un constructeur qui prend deux attributs : name et age.
    2. Nous créons une instance de la classe Person avec les valeurs "Alice" et 30.
    3. Nous utilisons pickle.dump() pour sérialiser l'objet person et l'écrire dans un fichier appelé person.pkl en mode binaire ('wb').
  • pickle.load()

    Cette fonction permet de désérialiser un objet à partir d'un fichier contenant un objet sérialisé par pickle.dump().

    Importation :

    import pickle

    Attributs :

    Paramètre Type Description Valeur par défaut
    file file-like object Le fichier ou flux contenant l'objet sérialisé. None

    Exemple de code :

    import pickle
    
    # Désérialisation de l'objet à partir du fichier
    with open('person.pkl', 'rb') as file:
        loaded_person = pickle.load(file)
    
    print(loaded_person.name)  # Affiche "Alice"
    print(loaded_person.age)   # Affiche 30

    Explication du code :

    1. Nous ouvrons le fichier person.pkl en mode binaire lecture ('rb').
    2. Nous utilisons pickle.load() pour charger l'objet sérialisé dans le fichier et le restaurer sous forme d'une instance de la classe Person.
    3. Nous affichons les attributs name et age de l'objet restauré.
  • Sérialisation d'objets personnalisés avec des classes

    Lors de la sérialisation d'objets personnalisés, comme des instances de classes, il est souvent nécessaire de personnaliser le comportement de sérialisation pour gérer correctement les objets. Cela peut être accompli en utilisant les méthodes __getstate__ et __setstate__ dans la classe.

    Importation :

    import pickle

    Exemple de code :

    import pickle
    
    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        # Méthode pour définir l'état à sérialiser
        def __getstate__(self):
            state = self.__dict__.copy()
            state['age'] = None  # Exclusion de l'attribut 'age' de la sérialisation
            return state
    
        # Méthode pour restaurer l'état
        def __setstate__(self, state):
            self.__dict__.update(state)
            self.age = 30  # Définir une valeur par défaut pour 'age' à la restauration
    
    # Sérialisation de l'objet
    person = Person("Bob", 25)
    with open('person_custom.pkl', 'wb') as file:
        pickle.dump(person, file)
    
    # Désérialisation de l'objet
    with open('person_custom.pkl', 'rb') as file:
        loaded_person = pickle.load(file)
    
    print(loaded_person.name)  # Affiche "Bob"
    print(loaded_person.age)   # Affiche 30 (valeur restaurée)

    Explication du code :

    1. Nous ajoutons les méthodes __getstate__ et __setstate__ à la classe Person pour personnaliser la sérialisation.
    2. Dans __getstate__, nous excluons l'attribut age de la sérialisation en lui attribuant la valeur None.
    3. Dans __setstate__, nous restaurons l'état de l'objet en réinitialisant l'attribut age à une valeur par défaut.
    4. Lors de la sérialisation et de la désérialisation, l'attribut age est manipulé selon cette logique.