как полностью сохранить/прочитать класс в Python

som = SOM_CLASS() # includes many big difficult data structures
som.hard_work()
som.save_to_disk(filename)
#then later or another program
som = SOM_CLASS()
som.read_from_file(filename)
som.do_anythink_else()

or

som = SOM_CLASS()
save(som)
#...
load(som)
som.work()

как проще всего это сделать?


person Mike    schedule 26.02.2010    source источник
comment
Любое другое требование? Скорость/размер/безопасность/портативность? docs.python.org/library/json.html может быть вариантом.   -  person Esteban Küber    schedule 27.02.2010
comment
требование = легко и быстро сделать это и выполнить другую работу)   -  person Mike    schedule 27.02.2010
comment
Вы должны изменить это на то, как полностью сохранять/читать объект в Python   -  person Nicolas Shu    schedule 15.03.2021


Ответы (4)


Вы можете (де)сериализовать с помощью pickle. Он обратно совместим, то есть будет поддерживать все старые протоколы в будущих версиях.

import pickle

som = SOM_CLASS()
fileObject = <any file-like object>
pickle.dump(som, fileObject)
#...
som = pickle.load(fileObject)
som.work()

Но имейте в виду, что если вы переносите консервированные объекты на другой компьютер, убедитесь, что соединение не может быть изменено, так как pickle может быть небезопасным. (эту статью должен знать каждый пользователь pickle).

Другой альтернативой является старый модуль marshal.

person AndiDog    schedule 26.02.2010
comment
Надя... Отвечаю даже в автономном режиме :) stackoverflow.com/users/97828/nadia-alramli - person Esteban Küber; 27.02.2010

Я использую этот код:

import cPickle
import traceback

class someClass():
    def __init__(self):
        #set name from variable name. http://stackoverflow.com/questions/1690400/getting-an-instance-name-inside-class-init
        (filename,line_number,function_name,text)=traceback.extract_stack()[-2]
        def_name = text[:text.find('=')].strip()
        self.name = def_name

        try:
            self.load()
        except:
            ##############
            #to demonstrate
            self.someAttribute = 'bla'
            self.someAttribute2 = ['more']
            ##############

            self.save()

    def save(self):
        """save class as self.name.txt"""
        file = open(self.name+'.txt','w')
        file.write(cPickle.dumps(self.__dict__))
        file.close()

    def load(self):
        """try load self.name.txt"""
        file = open(self.name+'.txt','r')
        dataPickle = file.read()
        file.close()

        self.__dict__ = cPickle.loads(dataPickle)

Этот код сохраняет и загружает класс из его фактического имени экземпляра класса. Код взят из моего блога http://www.schurpf.com/python-save-a-class/.

person schurpf    schedule 08.02.2012
comment
Превосходно! Именно то, что я хотел. - person markroxor; 26.03.2018
comment
Блин, сам бы до такого додумался! :) - person Jim Jam; 09.01.2020

Взгляните на библиотеку Python pickle.

person Amber    schedule 26.02.2010

Используйте pickle таким образом:

import pickle
class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade # 0 - 100
    def get_grade(self):
        print (self.grade)
s1 = Student("Tim", 19, 95)

#save it
with open(f'test.pickle', 'wb') as file:
    pickle.dump(s1, file) 

#load it
with open(f'test.pickle', 'rb') as file2:
    s1_new = pickle.load(file2)

#check it
s1_new.get_grade()
# it prints 95
person Hadij    schedule 24.02.2021