python – 不能用kwargs取消新风格吗?
发布时间:2020-12-20 11:17:37 所属栏目:Python 来源:网络整理
导读:在我的类实例化期间,我初始化一些不可选择的字段.因此,为了能够(un)正确地挑选我的类,我希望我的init方法可以在unpickling上调用.这似乎是它与旧式课程一起使用的方式. 对于新的样式类,我需要使用__new__和__getnewargs__.这是我做的: import cPickleclass
在我的类实例化期间,我初始化一些不可选择的字段.因此,为了能够(un)正确地挑选我的类,我希望我的init方法可以在unpickling上调用.这似乎是它与旧式课程一起使用的方式.
对于新的样式类,我需要使用__new__和__getnewargs__.这是我做的: import cPickle class Blubb(object): def __init__(self,value): self.value = value class Bla(Blubb): def __new__(cls,value): instance = super(Bla,cls).__new__(cls) instance.__init__(value) return instance def __getnewargs__(self): return self.value,def __getstate__(self): return {} def __setstate__(self,dct): pass x = Bla(2) print x.value pickled = cPickle.dumps(x,2) x_ = cPickle.loads(pickled) assert x_.value == 2 如果没有obj = C .__ new __(C,* args)的事实,这将没有问题.现在有** kwargs.所以我在__new__和__init__方法中仅限于非关键字参数. 有谁知道解决这个问题的方法?这真的很不方便. 解决方法
pickle协议2默认调用cls .__ new __(cls,* args),但有一种解决方法.如果使用__reduce__,则可以返回一个函数,该函数将您的参数映射到__new__.我能够修改你的例子让** kwargs工作:
import cPickle class Blubb(object): def __init__(self,value,foo=None,bar=None): self.value = value self.foo = foo self.bar = bar def _new_Bla(cls,kw): "A function to map kwargs into cls.__new__" return cls.__new__(cls,**kw) class Bla(Blubb): def __new__(cls,**kw): instance = super(Bla,cls).__new__(cls) instance.__init__(value,**kw) return instance def __reduce__(self): kwargs = {'foo': self.foo,'bar': self.bar} return _new_Bla,(self.__class__,self.value,kwargs),None x = Bla(2,bar=[1,2,3]) pickled = cPickle.dumps(x,2) y = cPickle.loads(pickled) assert y.value == 2 assert y.bar == [1,3] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |