Python中__str__和__repr__的正确用法
我现在的项目需要大量使用位域。我找到了一种简单实用的位域类的实现方法,但它缺少一些我需要的功能,所以我决定对它进行扩展。我刚刚实现了__str__
和__repr__
,想确认一下我是否遵循了约定。
__str__
应该是非正式且简洁的,所以我让它返回位域的十进制值(也就是说,str(bit field 11)
会返回"3"
)。
__repr__
应该是对象的正式表示,所以我让它返回实际的位字符串(也就是说,repr(bit field 11)
会返回"11"
)。
你觉得这样的实现符合str
和repr
的约定吗?
另外,我使用了bin()
函数来获取存储在类中的值的位字符串。这在Python 2.6之前是不兼容的,有没有其他替代方法?
谢谢,
皮特
3 个回答
__repr__
这个方法需要返回一个字符串,这个字符串如果传给你的构造函数,就能创建一个和原始对象一模一样的新对象。
你现在的返回值是 '11',但是如果你把 '11' 传给构造函数,得到的结果就不会是和原来的对象相同的。所以这个 __repr__
方法是不合适的。
我觉得可以让 __str__
返回一个十六进制的表示方式。这样一来,我们就能更直观地看到实际的位值,使用起来也更方便。而且十六进制的表示其实比十进制的字符还要少,还是挺简洁的。
在编程中,__repr__
方法最好返回一个字符串,这个字符串可以用来重新创建对象,比如你可以用 eval
来执行它。具体的内容可以参考文档 这里。不过这并不是一个绝对的规则,因为它可能会受到用户如何导入你的模块的影响。
我建议让 __str__
方法返回二进制字符串,而 __repr__
方法返回 Classname(binary_string)
,或者其他可以用来重新创建对象的内容。
在我维护的 bitstring 模块中,如果比特字符串的长度是4的倍数,__str__
返回的是十六进制字符串;如果不是,则返回二进制字符串或两者的组合。此外,如果比特字符串非常长,它会被截断(你可不想在交互式会话中打印一个100 MB的比特字符串!)
如果我是你,我会完全避免使用 bin()
函数。原因是如果你的比特字符串以零位开头,它就无法使用(可以查看我在 这里 提出的相关问题)。我建议使用 bin
方法或属性来代替。