10

我当前的项目需要大量使用位域。我为 bit a field 类找到了一个简单、实用的配方,但它缺少一些我需要的功能,所以我决定扩展它。我刚刚开始实施__str____repr__并且我想确保我遵循惯例。

__str__应该是非正式和简洁的,所以我让它返回位字段的十进制值(str(bit field 11)"3".

__repr__应该是对象的官方表示,所以我让它返回实际的位字符串(即repr(bit field 11)"11")。

在您看来,这种实现是否符合 和 的str约定repr

此外,我使用该bin()函数来获取存储在类中的值的位串。这与 Python < 2.6 不兼容,是否有替代方法?

干杯,

皮特

4

3 回答 3

12

__repr__最好是一个可用于重新创建对象的字符串,例如,如果您在其上使用-请参阅此处eval的文档。这不是一门精确的科学,例如,它可能取决于模块的用户如何导入它。

我将__str__返回二进制字符串,以及__repr__returnClassname(binary_string)或任何可用于重新创建对象的东西。

在位模块(我维护)中,__str__如果位串是 4 位长的倍数,则它是十六进制,否则它是二进制或两者的组合。此外,如果位串很长,那么它会被截断(您不想尝试在交互式会话中打印 100 MB 位串!)

如果我是你,我会完全避免使用该bin()功能。原因是如果您的位串以零位开头,则无法使用它(请参阅我的问题here)。我建议使用bin方法或属性来代替。

于 2010-05-11T17:19:40.997 回答
1

我会考虑__str__改为返回十六进制表示。这样,更容易观察实际位值是什么,因此更有用。但仍然相当简洁(实际上,比十进制表示的字符少)。

于 2010-05-11T17:10:48.553 回答
0

__repr__需要返回一些东西,如果传递给你的构造函数,将创建一个新对象,它是原始对象的相同副本。

你的返回'11',但如果你将'11'传递给你的构造函数,你将不会得到相同的位域。所以这__repr__是不行的。

于 2010-05-11T17:25:32.877 回答