Строка для объекта в Python - PullRequest
3 голосов
/ 22 июня 2011

Мне нужно иметь возможность преобразовать любое строковое представление объекта обратно в его исходное состояние на другом компьютере. В качестве примера я буду использовать класс A:

    class A:
        def __init__(self):
            self.data = "test"
            self.name = "Bob"

        def __str__(self):
            return str(self.data) + " " + str(self.name)

Объект класса A должен быть в состоянии воссоздать на отдельном компьютере. Поэтому, если отдельный компьютер получил («A», «memberData memberName»), он мог бы преобразовать это в объект класса A. Мне нужно, чтобы это было возможно с любым пользовательским объектом. Желательно, чтобы пользователю было необходимо только создать метод toString () и toObject ().

Ответы [ 5 ]

12 голосов
/ 22 июня 2011

Вы смотрите на способы сериализации объектов;это очень стандартная проблема.pickle является стандартным решением, и вы должны сначала изучить его.Если вы хотите сделать класс с возможностью выбора, вам нужно определить для него несколько пользовательских методов и убедиться, что модуль, в котором он определен, можно найти как на исходном, так и на конечном компьютере.Затем вы можете pickle.dumps(obj), который будет возвращать строку, и pickle.loads(my_str) для восстановления объекта.

Другие опции включают marshal (низкоуровневый) и json (стандарт для веб-данных).

3 голосов
/ 22 июня 2011
1 голос
/ 22 июня 2011

Если вы хотите сериализовать и десериализовать объекты Python, pickle уже было указано на очень хорошее и стандартное решение. Python также использует repr для получения строковых представлений объектов, которые могут использоваться для создания эквивалентного объекта. В вашем случае самым простым способом было бы добавить data и name в качестве аргументов конструктора и определить функцию __repr__, используя repr членов данных:

class A:
    def __init__(self, data, name):
        self.data = data
        self.name = name

    def __repr__(self):
        return "%s(%s,%s)" % (self.__class__.__name__, repr(self.data), repr(self.name))

Тогда вы можете сделать

a = A('test', 'Bob')
a_repr = repr(a)
a_copy = eval(a_repr)

и так далее. Очевидно, это станет трудным для больших и более сложных классов.

1 голос
/ 22 июня 2011

соленья и полки могут быть полезны.Например,

import shelve

a = A();

db = shelve.open('myclasses')
db['a'] = a
db.close()

Это создаст файл myclasses, который будет хранить ваши классы.

0 голосов
/ 25 октября 2013

Рассол, кажется, правильный выбор.

Возможно, вы захотите использовать методы dump() и load() для сохранения и получения объекта из строки.

# The object to pickle
object_pi = myDict    
# Dump the data as string to file 
pickle.dump(object_pi, filename)

# The file with serialized data to retrieve
fileHandler = open(filename, 'r') 
# The data is stored into my_object variable
my_object = pickle.load(fileHandler)

Ссылка на источник: snip2code - Использование Pickle для сохранения объектов в Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...