__reduce__和__reduce_ex__有什么区别?

25 投票
2 回答
12953 浏览
提问于 2025-04-11 09:30

我知道这些方法是用来进行“序列化”和“反序列化”的,和内置的reduce函数没有关系。但是这两者有什么区别呢?我们为什么需要这两者呢?

2 个回答

9

__reduce_ex__ 是一个本来应该是 __reduce__ 的功能,但它没有变成的东西。__reduce_ex__ 的工作方式和 __reduce__ 类似,但它会传递一个叫做“pickle协议”的东西。

35

文档上说:

如果提供了,在进行“序列化”(也就是把对象转换成可以存储或传输的格式)时,__reduce__() 方法会被调用,而且不需要传入任何参数。这个方法必须返回一个字符串或者一个元组。

另一方面,

在实现 __reduce__ 时,有时候知道协议版本是很有用的。你可以通过实现一个叫 __reduce_ex__ 的方法来做到这一点,而不是使用 __reduce__。如果 __reduce_ex__ 存在,它会优先于 __reduce__ 被调用(你仍然可以提供 __reduce__ 以保持向后兼容)。__reduce_ex__ 方法会接收一个整数参数,这个参数就是协议版本。

另外,Guido 说 这是一个可以改进的地方。

撰写回答