Как сохранить экземпляр класса в файл?
class MyClass:
a = 1
A = MyClass()
Я хочу сохранить A в какой-нибудь файл чтобы при загрузке он автоматически стал объектом. Как это сделать, и загрузить его потом из этого файла?
Ответы (2 шт):
Автор решения: Кузьмин Алексей
→ Ссылка
Инструкция класс это составная инструкция и у нее должно быть тело, пусть и пустое:
class Foo: pass
Для сериализации объектов можно воспользоваться модулем 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)