Python中的__str__()方法 - 是不良实践吗?

-1 投票
1 回答
575 浏览
提问于 2025-04-18 09:52

我遇到了一段代码,这段代码在一个类的 __str__ 方法里每次都重新创建一些对象。

我记得 __str__ 方法其实不应该去创建对象。它应该只是做一些简单的格式化操作,然后返回一个字符串。

不过我没有任何证据来支持这个说法。有没有什么约定或者 PEP(Python 的增强提案)来解释 __str__ 的正确用法?我只找到了一些关于 strrepr 用法的 PEP。

我在 Stack Overflow 上搜索过,但没有找到答案。

编辑:

你们问我有没有例子。不幸的是,我不能分享这段代码,因为它不是我的。我是在寻求社区的 一般指导原则(如果有的话)。

这里有一个 大致相似 的用法:

from collections import OrderedDict


class A:

    def __init__(self, a, b, c):

        self.a = a
        self.b = b
        self.c = c

    def __str__(self):
        # recreated every time...
        dict_sorted = OrderedDict(sorted(self.__dict__.items()))
        result = []
        for i in dict_sorted.keys():
            result.append(str((i, dict_sorted[i])))
        return ' '.join(result)

if __name__ == "__main__":
    a = A('foo', 'bar', 'baz')
    print(a)

1 个回答

3

__str__方法中创建对象是完全可以的。Python是一种面向对象的语言,随时都在创建对象。在你的例子中,创建了一个OrderedDict、一个列表、一个键迭代器,还有一些元组和字符串。

你对这个__str__方法还有疑问吗?

 def __str__(self):
     return ' '.join(str(item) for item in sorted(self.__dict__.items()))

这个方法和你的__str__方法做的事情完全一样,只是少创建了一些方法。对于__str__方法没有其他限制,唯一的要求就是返回一个字符串对象。不过对于程序员来说,一般的建议是:一个方法不应该做一些意想不到的事情,所以__str__应该只负责创建字符串表示,别的事情就不要干了。

撰写回答