2016-10-26 7 views
1

Предположим, что я имел следующий подкласс, который я использую, чтобы временно жертвуют list с некоторыми дополнительными методами,Травление объекта в качестве экземпляра его родительского класса?

class MyList(list): 
    def some_function(self): 
     pass 

, а затем я сделать что-то вроде

>>> f = MyList() 
>>> .. bunch of list stuff ... 
>>> cPickle.dump(f,open('somefile','w')) 

Теперь, что все хорошо пока я пытаюсь открыть файл

>>> cPickle.load(open('somefile')) 

и я получаю жалобы, что MyList не существует. Есть ли способ каким-то образом получить MyList, чтобы рассолить как простой list, так что, когда я позже попытаюсь загрузить файл pickle, я не получу эту пропавшую ошибку класса? Я хотел бы, чтобы файл pickle ссылался только на встроенный тип list.

+0

Почему бы не решить проблему недостающего класса, имея свой модуль доступных для импорта, когда unpickling (с 'MyList' как глобальный, что модуль)? –

+1

Вы прочитали [документацию] (https://docs.python.org/3/library/pickle.html#pickling-class-instances)? – BrenBarn

+0

Вы можете настроить то, что мариновали, да, есть различные крючки, см. Https://docs.python.org/3/library/pickle.html#pickling-class-instances –

ответ

1

Я думаю, что вы хотели бы сделать выборку экземпляра класса и расслоить описание класса в маринованном объекте. pickle не подходит для описания класса, но dill.

>>> class MyList(list): 
... def some_function(self): 
...  pass 
... 
>>> f = MyList() 
>>> import dill 
>>> dill.dump(f, open('somefile','w')) 
>>> 

А потом при загрузке, он просто работает ...

[email protected]>$ python 
Python 2.7.12 (default, Jun 29 2016, 12:42:34) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import dill 
>>> f = dill.load(open('somefile','r')) 
>>> f 
[] 
>>> type(f) 
<class '__main__.MyList'> 
>>> g = f.__class__() 
+0

Блестящий! И он работает с Pypy для загрузки! – reckoner