[英]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.