Как замариновать экземпляр класса с помощью постоянных методов в Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как замариновать экземпляр класса с помощью постоянных методов в Python?

Сообщение Anonymous »

Я хочу сериализовать экземпляр класса в Python и сохранить методы постоянными. Я пробовал использовать joblib и Pickle, и я очень близок к укропу, но не могу этого понять.
Вот в чем проблема. Скажем, я хочу замариновать экземпляр класса следующим образом:

Код: Выделить всё

import dill

class Test():
def __init__(self, value=10):
self.value = value
def foo(self):
print(f"Bar! Value is: {self.value}")

t = Test(value=20)
with open('Test.pkl', 'wb+') as fp:
dill.dump(t, fp)

# Test it
print('Original: ')
t.foo()        # Prints "Bar! Value is: 20"
Позже определение Test меняется, и когда я перезагружаю свой маринованный объект, метод меняется:

Код: Выделить всё

class Test():
def __init__(self, value=10):
self.value = value
def foo(self):
print("...not bar?")

with open('Test.pkl', 'rb') as fp:
t2 = dill.load(fp)

# Test it
print('Reloaded: ')
t2.foo()        # Prints "...not bar?"
Теперь в случае перезагрузки значение атрибута сохраняется (

Код: Выделить всё

t2.value
— 20). Я могу приблизиться к тому, что хочу, сериализовав класс с помощью dill, а не экземпляр, вот так:

Код: Выделить всё

class Test():
def __init__(self, value=10):
self.value = value
def foo(self):
print(f"Bar! Value is: {self.value}")

t = Test(value=20)
with open('Test.pkl', 'wb+') as fp:
dill.dump(Test, fp)

# Test it
print('Original: ')
t.foo()        # Prints "Bar! Value is: 20"
Но потом, когда я его пересобираю, я получаю старый метод (то, что хочу), но теряю атрибуты экземпляра t (в этом случае я получаю значение по умолчанию 10 вместо значения экземпляра 20):

Код: Выделить всё

class Test():
def __init__(self, value=10):
self.value = value
def foo(self):
print("...not bar?")

with open('Test.pkl', 'rb') as fp:
test_class = dill.load(fp)
t2 = test_class()

# Test it
print('Reloaded: ')
t2.foo()        # Prints "Bar! Value is: 10"
В моем реальном случае использования в экземпляре класса имеется множество атрибутов. Я хочу иметь возможность выбирать атрибуты, а также методы, чтобы последующие изменения исходного кода не делали этот конкретный объект невозвратимым.
В настоящее время для восстановления этих объектов я копирую файлы исходного кода, но импорт становится очень беспорядочным — множество манипуляций с sys.path сбивают с толку, чтобы убедиться, что я загружаю правильный старый исходный код. Я также мог бы сделать что-то, где я мариную определение класса с помощью dill, а затем сохраняю все атрибуты в json или что-то в этом роде и перестраиваю таким образом, но мне интересно, есть ли простой способ сделать это с помощью dill или какого-либо другого пакета, который я еще не обнаружили. Мне кажется, это простой вариант использования.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как замариновать экземпляр класса с помощью постоянных методов в Python?
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Как замариновать экземпляр класса с помощью постоянных методов в Python?
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • Как замариновать объект QPixmap в Python 3
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • PicklingError: невозможно замариновать <встроенная функция reset_code>
    Anonymous » » в форуме Python
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • PicklingError: невозможно замариновать <встроенная функция reset_code>
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»