从__setstate__调用__init__可以吗

avi*_*orp 6 python init pickle getstate

我正在增强一个现有的类,它在__init__函数中进行一些计算以确定实例状态.它是确定调用__init__()__getstate__()以重用这些计算?

Jan*_*sky 4

总结 Kroltan 和 jonsrharpe 的反应:

技术上是没问题的

从技术上讲,它是可以工作的,如果你做得正确的话,就可以认为是OK的。

实际上这很棘手,避免这种情况

如果您将来编辑代码并触摸__init__,那么很容易(即使对您来说)忘记使用 in __setstate__,然后您就会进入难以调试的情况(问问自己,它来自哪里)。

class Calculator():
    def __init__(self):
        # some calculation stuff here
    def __setstate__(self, state)
        self.__init__()
Run Code Online (Sandbox Code Playgroud)

计算内容最好隔离到另一个共享方法中:

class Calculator():
    def __init__(self):
        self._shared_calculation()   

    def __setstate__(self, state)
        self._shared_calculation()

    def _shared_calculation(self):
        #some calculation stuff here
Run Code Online (Sandbox Code Playgroud)

这样你就会注意到。

注意:使用“_”作为共享方法的前缀是任意的,您不必这样做。

  • 我发现更奇怪的是,在不调用 __init__ 的情况下构造对象。 (3认同)