Я пытаюсь обновить поведение травления для производного класса, но не могу сохранить свойства объекта для сохранения в травлении.
import pandas as pd
class Fruit(pd.DataFrame):
def __init__(self):
super(Fruit, self).__init__()
self.codebook={3:4}
sdf = Fruit()
sdf.codebook ={1:2}
import pickle
with open('mypickle.pickle', 'wb') as f:
pickle.dump(sdf, f)
with open('mypickle.pickle') as f:
loaded_obj = pickle.load(f)
assert loaded_obj.__class__ == Fruit
assert loaded_obj.codebook
Окончательное утверждение не выполнено. AttributeError: 'Fruit' object has no attribute 'codebook'
Если мое определение класса вместо class Fruit(): pass
, тогда оно работает нормально.
Как мне выбрать объект и включить новые свойства "точка" (.codebook
)?
(Этот вопрос связан с открытым проектом по добавлению информации и функциональных возможностей кодовой книги данных обследования в класс Pandas DataFrame: https://github.com/cpbl/surveypandas)
Обновление:
Я попытался заменить DataFrame.to_pickle на собственный Fruit, который напрямую использует pickle.dump (self), и это не помогло тем же способом. (Почему?)
Вот неуместное усилие, которое преуспевает в записи всего, но приводит к чему-то, что не может быть понято pandas.read_pickle (). Также это кажется излишне неловким:
from pandas import DataFrame
import cPickle as pkl
class Fruit(DataFrame):
def __init__(self, data=None, codebook =None):
super(Fruit, self).__init__(data)
self.codebook=codebook
def to_pickle(self, path, compression='infer',
protocol= pkl.HIGHEST_PROTOCOL):
""" See pandas.io.pickle and pandas.DataFrame.to_pickle """
from pandas.io.pickle import to_pickle as pandas_to_pickle
return pandas_to_pickle( {'o': self, 'c':self.codebook}, path, compression=compression, protocol=protocol)
sdf = Fruit({'foo':[1,2,3]}, codebook={1:2})
sdf.to_pickle('mypickle.pickle')
with open('mypickle.pickle') as f:
loaded_obj = pkl.load(f)
sdf2 = Fruit(loaded_obj['o'], codebook = loaded_obj['c'])
assert sdf2.__class__ == Fruit
assert sdf2.codebook