Python正确使用__str__和__repr__

时间:2010-05-11 17:06:29

标签: python bit-manipulation conventions representation

我目前的项目需要广泛使用位字段。我找到了一个简单的,功能齐全的recipe for bit a field class,但它缺少我需要的一些功能,所以我决定扩展它。我刚刚实施__str____repr__,我想确保遵循惯例。

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

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

您认为此实施是否符合strrepr的约定?

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

干杯,

皮特

3 个答案:

答案 0 :(得分:12)

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

我会让__str__返回二进制字符串,__repr__返回Classname(binary_string),或者可以用来重新创建对象的任何内容。

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

如果我是你,我会完全避免使用bin()功能。原因是如果你的位串以零位开头就不能使用它(参见我的问题here)。我建议使用bin方法或属性。

答案 1 :(得分:1)

我会考虑让__str__返回十六进制表示。通过这种方式,可以更容易地观察实际比特值是什么,因此更有用。但仍然非常简洁(事实上,字符数少于十进制表示)。

答案 2 :(得分:0)

__repr__需要返回一些内容,如果传递给您的构造函数,则会创建一个与原始对象完全相同的新对象。

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