簡體   English   中英

__slots__和泡菜的奇怪行為

[英]Odd behavior with __slots__ and pickle

我最近遇到了槽和泡菜的特殊問題。 我已將問題隔離到以下設置:

import operator
import pickle

class BinaryOperator(object):
    __slots__ = ("a", "b")

    operator = None

    def __init__(self, a=None, b=None):
        self.a = a
        self.b = b

    def execute(self):
        return self.operator(self.a, self.b)

class Add(BinaryOperator):
    __slots__ = ()

    operator = operator.add

if __name__ == "__main__":
    # This works as intended
    add = Add(1, 1)
    assert add.execute() == 2

    # This fails:
    # Traceback (most recent call last):
    #  File "slotstest.py", line 26, in <module>
    #    assert pickle_add.execute() == 2
    #  File "slotstest.py", line 14, in execute
    #    return self.operator(self.a, self.b)
    # AttributeError: a
    pickle_add = pickle.loads(pickle.dumps(add))
    assert pickle_add.execute() == 2

    # Workaround using pickling version
    pickle_add = pickle.loads(pickle.dumps(add, -1))
    assert pickle_add.execute() == 2

在Python 3上不會發生此問題,我認為這與新版本的pickle協議有關。

如何使Add與pickle的默認Python 2.7版本兼容?

如果需要支持古老的pickle協議,請在類中添加特殊方法來設置和恢復實例狀態,例如

def __getstate__(self):
    return self.a, self.b

def __setstate__(self, state):
    self.a, self.b = state

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM