我的问题是:
class A(object):
def __init__(self):
#init
def __setstate__(self,state):
#A __setstate__ code here
def __getstate__(self):
#A __getstate__ code here
return state
class B(A):
def __init__(self):
#creates many object variables here
A来自一个外部库。
较为复杂的解决方案
我想要避免这种情况
当对B进行pickling时,pickle会使用A类的__setstate__
和__getstate__
方法,因此为了使pickle正常工作,我应该做如下处理:
class B(A):
def __init__(self):
#creates many object variables here
def __setstate__(self,state)
A.__setstate__(self,state)
#B __setstate__ code here
#getting various variables from state for example
self._a0 = state['a0']
self._a1 = state['a1']
#...
self._a100 = state['a100']
self._a101 = state['a101']
def __getstate__(self):
state = A.__getstate__(self)
#B __setstate__ code here
#filling state with various variables
#getting various variables from state for example
state['a0'] = self._a0
state['a1'] = self._a1
#...
state['a100'] = self._a100
state['a101'] = self._a101
return state
我的问题是:
如何避免在B中定义__setstate__
和__getstate__
,以便pickle自己完成变量的序列化工作?
B中的所有变量都是pickle可以自行处理的类型。
因此,如果B没有继承A,则可以获得良好的结果:
b = B()
path = 'path.temp'
fout = open(path,'w')
pickler = pickl.Pickler(fout)
pickler.dump(b)
fout.close()
fin = open(path,'r')
upickler = pickl.Unpickler(fin)
b = unpickler.load()
fin.close()
#b has all variables
显而易见的解决方案
class B(object):
def __init__(self):
#creates many object variables here
a = A()
然而,我希望B可以继承A。你有什么解决方法,或者至少可以自动对B中的变量进行pickle / unpickle吗?
解决方案:
针对在Hard Solution中自动化pickling的问题:
在B中添加一个包含要pickle的变量的字典:
class B(A):
__picklableObjects__ = {'_a0', '_a1', ... ,'_a101'}
def __init__(self):
#creates many object variables here
A.__init__(self)
self._a0 = ...
...
self._a101 = ...
@staticmethod
def getPicklableObjects():
return B.__picklableObjects__
def __setstate__(self,state):
A.__setstate__(self,state)
for po in B.getPicklableObjects():
__dict__[po] = state[po]
def __getstate__(self):
state = A.__getstate__(self)
for po in B.getPicklableObjects():
state[po] = copy.deepcopy(__dict__[po])
return state
还有其他想法吗?
A的库:
好的,对于任何对A感兴趣的人,A是graph_tool.Graph: A src code
line 786: class Graph(object)
...
line 1517: __getstate__
...
line 1533: __setstate__
A
的代码访问权限吗?我通常以某种“选择退出”的方式编写我的__getstate__
方法,其中我复制实例的__dict__
属性并删除或修改不可拾取的条目。 这将很好地传递给子类。 - David ZwickerA
зҡ„д»Јз Ғд»ҘйҒҝе…Қз ҙеқҸ继жүҝе…ізі»гҖӮеҰӮжһңдёҖдёӘзұ»й»ҳи®Өд»Һе®ғзҡ„__getstate__
ж–№жі•иҝ”еӣһжүҖжңүеҶ…容并仅жҺ’йҷӨжңүй—®йўҳзҡ„еұһжҖ§пјҢжҲ‘и§үеҫ—жӣҙеҠ ж–№дҫҝгҖӮеҰӮжһңжӮЁиғҪзӣёеә”ең°дҝ®ж”№A
пјҢеҲҷе®Ңе…ЁдёҚйңҖиҰҒеңЁB
дёӯзј–еҶҷд»»дҪ•д»Јз ҒгҖӮ - David Zwicker