Python中的__str__()方法 - 是不良实践吗?
我遇到了一段代码,这段代码在一个类的 __str__
方法里每次都重新创建一些对象。
我记得 __str__
方法其实不应该去创建对象。它应该只是做一些简单的格式化操作,然后返回一个字符串。
不过我没有任何证据来支持这个说法。有没有什么约定或者 PEP(Python 的增强提案)来解释 __str__
的正确用法?我只找到了一些关于 str
和 repr
用法的 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__
应该只负责创建字符串表示,别的事情就不要干了。