gpt4 book ai didi

python - __new__ 在正确的类时不调用 __init__

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:07 25 4
gpt4 key购买 nike

我有一个类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)

其行为符合预期,并通过调用 __new__()__init__() 创建 Vertex()

但是,当我 unpickle Vertex() 时,会调用 __new__() 方法,但不会调用 __init__() 方法。我检查过,在解封实例时,实例的类是 Vertex,据我所知,应该调用 __init__()

最佳答案

在恢复对象时,Unpickling 故意不调用 __init__。它创建一个新的“空”对象(使用 __new__),然后重新对其应用状态。

您可以customize this process通过实现 __getinitargs__ (告诉 Pickle 使用给定的参数调用 __init__ 无论如何)或 Hook __setstate__ :

def __setstate__(self, state):
self.__dict__.update(state)
# do other things that need to be set on unpickling.

关于python - __new__ 在正确的类时不调用 __init__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23738074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com