__repr__ vs repr

时间:2012-10-13 22:32:07

标签: python repr

这两种方法有区别吗?

例如,

from datetime import date
today = date(2012, 10, 13)
repr(today)
'datetime.date(2012, 10, 13);

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

他们似乎做了同样的事情,但为什么有人想在常规报道中使用后者呢?

2 个答案:

答案 0 :(得分:10)

__repr__ method用于实施 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')
>>>>

答案 1 :(得分:4)

这是同样的事情

repr()视为包含以下代码:

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

所有这一切都是调用对象的__repr__()函数。我不确定为什么有人需要显式调用对象的__repr__()方法。事实上,这样做的编码风格通常很糟糕(令人困惑,并导致程序员提出类似你刚才所做的问题)。