python - 从 __setstate__ 调用 __init__ 可以吗

标签 python pickle init getstate

我正在增强现有类,该类在 __init__ 函数中进行一些计算以确定实例状态。是否可以从 __getstate__() 调用 __init__() 以重用这些计算?

最佳答案

总结 Kroltan 和 jonsrharpe 的 react :

技术上没问题

从技术上讲,它会起作用,如果你做得好,它可以被认为是 OK。

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

如果您以后编辑代码并触摸__init__,那么很容易(甚至对您而言)忘记在__setstate__ 中使用,然后您将进入难以执行的状态调试情况(问问自己,它来自哪里)。

class Calculator():
    def __init__(self):
        # some calculation stuff here
    def __setstate__(self, state)
        self.__init__()

计算的东西最好隔离到另一个共享方法中:

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

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

    def _shared_calculation(self):
        #some calculation stuff here

这样你会注意到。

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

关于python - 从 __setstate__ 调用 __init__ 可以吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23461479/

相关文章:

python - DestroyWindow 不会在 Mac 上使用 Python 和 OpenCV 关闭窗口

Python 的 __reduce__/copy_reg 语义和有状态的 unpickler

python - 如何将具有文件外依赖项的 sklearn 模型保存到磁盘?

objective-c - 检查对象是否为零时出了什么问题

ios - 错误消息 'init(accessToEntityTypes:)' 无法初始化 EKEventStore

python - 属性错误 : 'ElementTree' object has no attribute 'tag' in Python

python - 有没有办法判断函数是否在单元测试中执行?

Python 使用带有函数的排序给出 TypeError : date_compare() missing 1 required positional argument: error

python - 模拟 map_async 函数参数产生 PicklingError

Objective-C:初始化与初始化