Python __新的\uuuuu在正确的类时不调用\uuuu init
我有一个类Python __新的\uuuuu在正确的类时不调用\uuuu init,python,pickle,Python,Pickle,我有一个类Vertex() 采用以下方法: def __new__(cls, pos_x, pos_y, size_x, size_y, text): instance = super(Vertex, cls).__new__(cls) #print 'variables {0}, {1}, {2}, {3}, {4}'.format(pos_x, pos_y, size_x, size_y, text) #print instance.__cla
Vertex()
采用以下方法:
def __new__(cls, pos_x, pos_y, size_x, size_y, text):
instance = super(Vertex, cls).__new__(cls)
#print 'variables {0}, {1}, {2}, {3}, {4}'.format(pos_x, pos_y, size_x, size_y, text)
#print instance.__class__.__name__
return instance
def __init__(self, pos_x=None, pos_y=None, size_x=None, size_y=None, text=None):
print 'init'
super(Vertex, self).__init__()
在另一个类的方法中,我有以下调用:
self.vertices[touch.uid] = Vertex(pos_x=self.bounds[3][0], pos_y=self.bounds[2][1], size_x=self.bounds[1][0] - self.bounds[3][0], size_y= self.bounds[0][1] - self.bounds[2][1], text=None)
其行为符合预期,并通过调用\uuuu new\uuuuu()
和\uuu init\uuuu()
但是,当我取消勾选
Vertex()
时,将调用\uuuuuu new\uuuuuuuuu()
方法,但不会调用\uuuuuu init\uuuuuuuuuu()
方法。我检查了,在取消勾选时,实例的类是Vertex
,据我所知,应该调用\uuu init\uuu()
。在恢复对象时,故意取消勾选不会调用\uu init\uuu
。它创建一个新的“空”对象(使用\uuuuu new\uuuuu
),然后将状态重新应用于该对象
您可以通过实现\uuuuu getinitargs\uuuuu
(告诉Pickle无论如何都要调用\uuuuuu init\uuuu
,使用给定的参数)或挂接到\uuuuu setstate\uuuuu
:
def __setstate__(self, state):
self.__dict__.update(state)
# do other things that need to be set on unpickling.
不,故意取消勾选不会调用
\uuuuu init\uuuu
;您正在重新安装实例,而不是创建新实例。如果我需要运行\uuu init\uuu()
中的代码,那么解决此问题的最佳方法是什么\uuuu setstate\uuuuuuuuuuuuuuuuuuuuuu()
?或者更确切地说,创建了一个新实例,但它是用未点击的对象“初始化”的,而不是它自己的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。它的状态已还原。@MartijnPieters最终,我有一些子对象需要重新创建(它们不能与pickle一起使用),这就是为什么我需要\uuuu init\uuuu()
中的代码,我尝试使用\uu getinitargs\uuuuu()
但没有成功。当我使用pickle.HIGHEST_协议时
我的理解是这不会被调用。至少可以说是非常混乱。。。我最终使用了\uuuu getstate\uuuuuuuuuu()
/\uuuuuu setstate\uuuuuuuuuuuu()
的组合,并删除了\uuuuuuuuuu newargs\uuuuuuuuuuuu()
。我在\uuu setstate\uuu()
中调用了self.\uuu init\uuuu()
,以获得所需的效果。