Можно на самом деле пойти один шаг вперед и иметь объект, восстанавливают себя в любой тип, который вы хотите.
import pickle
import copy_reg
class myClass(object):
def __init__(self):
self.apple = 'banana'
class otherclass(object):
def __init__(self):
self.apple = 'existential woe'
def pickle_an_object(o):
print "pickling %s" % str(o)
return otherclass, (o.apple,)
copy_reg.pickle(myClass, pickle_an_object)
foo = myClass()
s = pickle.dumps(foo)
del myClass
del otherclass
class otherclass(object):
def __init__(self, appletype):
self.apple = 'not %s' % appletype
o2 = pickle.loads(s)
print o2.apple
Основная идея состоит в том, что вы упаковываете свой класс в своего рода "троянского коня", где его реконструкция вызывает экземпляр различного класса от того, каково это первоначально было.
не имеет значения, что otherclass
на стороне соления содержит. Все, что имеет значение, - то, что это существует на том же самом пути модуля как класс "назначения" - , рассол
просто помещает строковое представление имени модуля в сериализованный поток.
Так, чтобы сломать, что происходит в вышеупомянутом коде подробно:
- Мы регистрируем обычай, более придирчивый для
myClass
. Это может быть сделано с помощью copy_reg
или __ reduce_ex __
функция.
- , который заявляет Наш более придирчивый обычай, "солит это как случай
otherclass
" (который является куклой. Вы не делаете , нуждаются в "реальном" содержании otherclass
на стороне соления, потому что все, что входит в рассол, является модулем/именем класса).
- Мы солим объект и, "посылает его через провод", туда, где реальная версия
otherclass
существует.
- На отдаленной стороне,
otherclass
иллюстрируется примерами с данными из кортежа, возвращенного таможенной функцией соления.
Питон может быть довольно сильным!