Python中__str__和__repr_之间有什么区别?


当前回答

str-从给定对象创建一个新的字符串对象。

repr-返回对象的规范字符串表示形式。

差异:

str():

使对象可读为最终用户生成输出

repr():

需要复制对象的代码为开发人员生成输出

其他回答

具有toString方法语言经验的程序员倾向于实现__str__而不是__repr_。如果只在Python中实现这些特殊方法之一,请选择__repr_。

来自Luciano Ramalho的《流利的Python》一书。

老实说,eval(repr(obj))从不使用。如果你发现自己在使用它,你应该停止,因为eval是危险的,字符串是一种非常低效的序列化对象的方法(改用pickle)。

因此,我建议设置__repr_=__str__。原因是str(list)在元素上调用repr(我认为这是Python最大的设计缺陷之一,Python 3没有解决)。实际的repr可能对打印([your,objects])的输出没有太大帮助。

为了证明这一点,根据我的经验,repr函数最有用的用例是将一个字符串放在另一个字符串中(使用字符串格式)。这样,您就不必担心转义引号或其他任何问题。但请注意,这里没有eval。

其他答案中缺少的一个方面。的确,一般来说,模式是:

__str__的目标:人类可读__repr_的目标:明确,可能通过eval机器可读

不幸的是,这种区别是有缺陷的,因为Python REPL和IPython都使用__repr_在REPL控制台中打印对象(请参见Python和IPython的相关问题)。因此,以交互控制台工作为目标的项目(例如,Numpy或Pandas)已经开始忽略上述规则,转而提供一个人类可读的__repr_实现。

repr()用于调试或日志。它用于开发人员理解代码。另一方面,str()用户用于非开发人员(QA)或用户。

class Customer:
    def __init__(self,name):
        self.name = name
    def __repr__(self):
        return "Customer('{}')".format(self.name)
    def __str__(self):
        return f"cunstomer name is {self.name}"

cus_1 = Customer("Thusi")
print(repr(cus_1)) #print(cus_1.__repr__()) 
print(str(cus_1)) #print(cus_1.__str__())

__str__必须返回字符串对象,而__repr_可以返回任何python表达式。如果缺少__str__实现,则__repr_函数用作回退。如果缺少__repr_函数实现,则没有回退。如果__repr_函数返回对象的String表示,我们可以跳过__str__函数的实现。

资料来源:https://www.journaldev.com/22460/python-str-repr-functions