栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 面试经验 > 面试问答

在尝试腌制对象时,为什么我的类定义__slots__时出错?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在尝试腌制对象时,为什么我的类定义__slots__时出错?

定义类

__slots__
(而不是
__getstate__
)的类可以是您的祖先类,也可以是您的属性或项的类(或祖先类),直接或间接地:本质上,有
引用 中有任何对象的类具有您的对象将成为根,因为酸洗需要保存整个图形。

解决这个难题的一个简单方法是使用protocol

-1
,这意味着“可以使用的最佳协议pickle”。默认值为基于ASCII的古老协议,该协议对
__slots__
vs施加了此限制
__getstate__
。考虑:

>>> class sic(object):...   __slots__ = 'a', 'b'... >>> import pickle>>> pickle.dumps(sic(), -1)'x80x02c__main__nsicnqx00)x81qx01.'>>> pickle.dumps(sic())Traceback (most recent call last):  [snip snip]    raise TypeError("a class that defines __slots__ without "TypeError: a class that defines __slots__ without defining __getstate__ cannot be pickled>>>

正如你看到的,协议

-1
采取
__slots__
了事,而默认的协议给你看到了同样的异常。

协议的问题

-1
:它生成一个二进制字符串/文件,而不是像默认协议那样的ASCII字符串/文件;最终的腌制文件将无法通过足够古老的Python版本加载。除了关键优势外,优势还
__slots__
包括更紧凑的结果和更好的性能。

如果您被迫使用默认协议,则需要准确确定哪个类给您带来了麻烦以及原因。如果是这种情况,我们可以讨论策略(但如果您可以使用该

-1
协议,那就更好了,以至于不值得讨论;-),寻找麻烦的类/对象的简单代码检查被证明太复杂了(我在请注意一些基于深度复制的技巧,以获取整个图形的可用表示(以防您想知道)。



转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/640317.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号