python-如何腌制从A继承的B类(具有许多变量)的对象,该对象定义了__setstate__和__getstate__
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-如何腌制从A继承的B类(具有许多变量)的对象,该对象定义了__setstate__和__getstate__,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2888字,纯文字阅读大概需要5分钟。
内容图文
![python-如何腌制从A继承的B类(具有许多变量)的对象,该对象定义了__setstate__和__getstate__](/upload/InfoBanner/zyjiaocheng/674/b292a4bf06f6402c8d7ae64411f956a0.jpg)
我的问题是:
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时,腌制当然会使用类A的__setstate__和__getstate__方法,因此,为了使腌制工作,我应该执行以下操作:
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可以自己进行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中的酸洗/取消酸洗变量?
解决方法:
至于在硬解决方案中自动进行酸洗
将包含要腌制的变量的字典添加到B中:
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都是graph_tool.Graph:
A src code
line 786: class Graph(object)
...
line 1517: __getstate__
...
line 1533: __setstate__
解决方法:
根据文档,当未定义__getstate__时,实例的__dict__被腌制,因此也许可以使用它来定义自己的状态方法,作为A方法和实例的__dict__的组合:
import pickle
class A(object):
def __init__(self):
self.a = 'A state'
def __getstate__(self):
return {'a': self.a}
def __setstate__(self, state):
self.a = state['a']
class B(A):
def __init__(self):
A.__init__(self)
self.b = 'B state'
def __getstate__(self):
a_state = A.__getstate__(self)
b_state = self.__dict__
return (a_state, b_state)
def __setstate__(self, state):
a_state, b_state = state
self.__dict__ = b_state
A.__setstate__(self, a_state)
b = pickle.loads(pickle.dumps(B()))
print b.a
print b.b
内容总结
以上是互联网集市为您收集整理的python-如何腌制从A继承的B类(具有许多变量)的对象,该对象定义了__setstate__和__getstate__全部内容,希望文章能够帮你解决python-如何腌制从A继承的B类(具有许多变量)的对象,该对象定义了__setstate__和__getstate__所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。