Python中__str__和__repr__的正确用法

10 投票
3 回答
3191 浏览
提问于 2025-04-15 22:35

我现在的项目需要大量使用位域。我找到了一种简单实用的位域类的实现方法,但它缺少一些我需要的功能,所以我决定对它进行扩展。我刚刚实现了__str____repr__,想确认一下我是否遵循了约定。

__str__应该是非正式且简洁的,所以我让它返回位域的十进制值(也就是说,str(bit field 11)会返回"3")。

__repr__应该是对象的正式表示,所以我让它返回实际的位字符串(也就是说,repr(bit field 11)会返回"11")。

你觉得这样的实现符合strrepr的约定吗?

另外,我使用了bin()函数来获取存储在类中的值的位字符串。这在Python 2.6之前是不兼容的,有没有其他替代方法?

谢谢,

皮特

3 个回答

0

__repr__ 这个方法需要返回一个字符串,这个字符串如果传给你的构造函数,就能创建一个和原始对象一模一样的新对象。

你现在的返回值是 '11',但是如果你把 '11' 传给构造函数,得到的结果就不会是和原来的对象相同的。所以这个 __repr__ 方法是不合适的。

1

我觉得可以让 __str__ 返回一个十六进制的表示方式。这样一来,我们就能更直观地看到实际的位值,使用起来也更方便。而且十六进制的表示其实比十进制的字符还要少,还是挺简洁的。

12

在编程中,__repr__ 方法最好返回一个字符串,这个字符串可以用来重新创建对象,比如你可以用 eval 来执行它。具体的内容可以参考文档 这里。不过这并不是一个绝对的规则,因为它可能会受到用户如何导入你的模块的影响。

我建议让 __str__ 方法返回二进制字符串,而 __repr__ 方法返回 Classname(binary_string),或者其他可以用来重新创建对象的内容。

在我维护的 bitstring 模块中,如果比特字符串的长度是4的倍数,__str__ 返回的是十六进制字符串;如果不是,则返回二进制字符串或两者的组合。此外,如果比特字符串非常长,它会被截断(你可不想在交互式会话中打印一个100 MB的比特字符串!)

如果我是你,我会完全避免使用 bin() 函数。原因是如果你的比特字符串以零位开头,它就无法使用(可以查看我在 这里 提出的相关问题)。我建议使用 bin 方法或属性来代替。

撰写回答