在python类中的repr vs str - 两者都给出了

时间:2018-05-22 21:22:28

标签: python django

我已经阅读并理解了repr和str之间的区别并注意到了差异。

  • repr - unambigous
  • str - 可读

两者都使用了什么?我写了一个简单的类,发现在给出repr时会调用repr。

class test():

    def __repr__(self):
        return 'repr called'

    def __str__(self):
        return 'str called'


x = test()
print x

现在,当我检查Django ValidationError中两个类的实现时,我不确定何时会调用str,因为repr函数已经过载。

https://docs.djangoproject.com/en/2.0/_modules/django/core/exceptions/#ValidationError

def __str__(self):
    # print 'validationerror str'
    if hasattr(self, 'error_dict'):
        return repr(dict(self))
    return repr(list(self))

def __repr__(self):
    # print 'validationerror repr'
    return 'ValidationError(%s)' % self

如何以及何时调用__str__函数?

1 个答案:

答案 0 :(得分:1)

基本上,调用__str__()进行显式字符串转换,即str(x)将调用x.__str__()。像print()这样的函数也会对其参数执行字符串转换。

您的测试代码调用__repr__()而不是__str__()的原因是缩进已关闭 - __str__()实际上并不是该类的一部分,因此它是不叫。否则print会执行字符串转换,但如果str(x)未定义,则x.__repr__()会回退到__str__()