首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__slots__和泡菜的奇数行为

__slots__和泡菜的奇数行为
EN

Stack Overflow用户
提问于 2015-02-23 00:52:28
回答 1查看 589关注 0票数 1

我最近遇到了一个特殊的问题,插槽和泡菜。我已经将问题隔离到以下设置:

代码语言:javascript
复制
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上,我认为这与泡菜协议的新版本有关。

如何使Add与默认Python2.7版本的泡菜兼容?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-23 01:06:01

如果需要支持古老的泡菜协议,请在类中添加特殊方法来设置和恢复实例状态,例如

代码语言:javascript
复制
def __getstate__(self):
    return self.a, self.b

def __setstate__(self, state):
    self.a, self.b = state
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28665411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档