__repr__和repr的区别

3
有两种方法之间有什么区别吗?
例如,
from datetime import date
today = date(2012, 10, 13)
repr(today)
'datetime.date(2012, 10, 13);

today.__repr__()
'datetime.date(2012, 10, 13)'

他们似乎做着相同的事情,但为什么有人想要使用后者而不是常规的repr呢?
2个回答

12

__repr__方法用于自定义repr()的结果。它被repr()str()(如果没有定义__str__)使用。不应该显式地调用__repr__

区别在于,repr()强制将字符串作为返回类型,并且repr()在类对象上查找__repr__,而不是实例本身:

>>>> class C(object):
....   def __repr__(self):
....     return 1 # invalid non-string value
....
>>>> c = C()
>>>> c.__repr__() # works
1
>>>> repr(c) # enforces the rule
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __repr__ returned non-repr (type 'int')
>>>> c # calls repr() implicitly
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __repr__ returned non-repr (type 'int')
>>>> str(c)  # also uses __repr__
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __str__ returned non-str (type 'int')
>>>> c.__repr__ = lambda: "a"
>>>> c.__repr__() # lookup on instance
'a'
>>>> repr(c) # old method from the class
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: __repr__ returned non-repr (type 'int')
>>>>

4

这是同样的事情。

repr()看作包含以下代码:

def repr(obj):
    return obj.__repr__()

它所做的就是调用对象的__repr__()函数。我不确定为什么有人需要显式地调用对象的__repr__()方法。事实上,这通常是不好的编码风格(它会让人感到困惑,并导致程序员像你刚才问的那样提出问题)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接