Как сохранить экземпляр класса в файл?

class MyClass:

    a = 1

A = MyClass()

Я хочу сохранить A в какой-нибудь файл чтобы при загрузке он автоматически стал объектом. Как это сделать, и загрузить его потом из этого файла?


Ответы (2 шт):

Автор решения: Кузьмин Алексей
  1. Инструкция класс это составная инструкция и у нее должно быть тело, пусть и пустое:

    class Foo: pass

  2. Для сериализации объектов можно воспользоваться модулем pickle

→ Ссылка
Автор решения: Михаил Муругов

Для этого вам надо в классе определить магические методы __setstate__ и __getstate__, которые используются модулем pickle для сериализации и десериализации объектов.


Пример:

import pickle


class MyClass:
    def __init__(self, param1, param2, *args):
        self.param1 = param1  # Какие-то переменные экземпляра класса
        self.param2 = param2
        self.args = args

    def __str__(self) -> str:  # Для наглядности print'а
        return "I am {}\nMy param1 is {}\nParam2 is {}\nargs is {}".format(
            self.__class__,
            self.param1,
            self.param2,
            self.args
        )

    def __getstate__(self) -> dict:  # Как мы будем "сохранять" класс
        state = {}
        state["param1"] = self.param1
        state["param2"] = self.param2
        state["args"] = self.args
        return state

    def __setstate__(self, state: dict):  # Как мы будем восстанавливать класс из байтов
        self.param1 = state["param1"]
        self.param2 = state["param2"]
        self.args = state["args"]


a = MyClass("val1", 42, "test", "yee")
print(a, end="\n========\n")  # Выведет информацию о классе
serialized = pickle.dumps(a)  # Сериализуем 
print(serialized, end="\n========\n")  # Выведет какие-то байты
b = pickle.loads(serialized)  # Восстанавливаем экземпляр класса из байтов
print(b)  # Смотрим, что восстановилось


Для записи в файл:

with open("file.pkl", "wb") as fp:
    pickle.dump(a, fp)

Для восстановления класса из файла:

with open("file.pkl", "rb") as fp:
    a = pickle.load(fp)
→ Ссылка