__str__ 与 __unicode__ 的区别

231 投票
6 回答
73474 浏览
提问于 2025-04-15 13:45

在Python中,有没有什么约定来决定什么时候应该实现__str__()__unicode__()这两个方法?我发现很多类更常重写__unicode__(),而不是__str__(),但这似乎并不一致。有没有什么具体的规则来判断什么时候实现一个而不是另一个?实现这两个方法是必要的,还是说这样做是个好习惯?

6 个回答

15

随着世界变得越来越小,你遇到的任何字符串最终都会包含Unicode字符。所以对于任何新应用程序,你至少应该提供一个叫做 __unicode__() 的功能。至于你是否还要重写 __str__(),那就完全看个人喜好了。

24

如果我不特别在意某个类的字符串化性能,我通常只会实现 __unicode__ 方法,因为这个方法更通用。当我确实在意这些细微的性能问题时(这种情况比较少见),我可能只实现 __str__ 方法(前提是我能证明字符串化的结果中绝对不会有非ASCII字符),或者同时实现两个方法(如果两者都有可能的话),这样可能会有所帮助。

我觉得这些原则是很靠谱的,但在实际操作中,很多时候我们会知道字符串中只会有ASCII字符,而不去费心去证明这一点(比如字符串化的内容只有数字、标点符号,可能还有一个简短的ASCII名字;-),在这种情况下,直接使用“只实现 __str__”的方法是很常见的。不过,如果我曾经合作的编程团队提议制定一个本地的指导方针来避免这样做,我会支持这个提议,因为在这些问题上容易出错,而且“过早优化是编程中的万恶之源”;-)。

272

__str__() 是一个旧的方法,它返回的是字节数据。__unicode__() 是新的、推荐使用的方法,它返回的是字符。虽然这两个名字有点让人困惑,但在 2.x 版本中,我们必须使用它们以保持兼容性。一般来说,你应该把所有的字符串格式化放在 __unicode__() 里面,并创建一个简单的 __str__() 方法:

def __str__(self):
    return unicode(self).encode('utf-8')

在 3.0 版本中,str 返回的是字符,所以相应的方法被命名为 __bytes__()__str__()。这些方法的行为是符合预期的。

撰写回答