首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__repr__ vs repr

__repr__ vs repr
EN

Stack Overflow用户
提问于 2012-10-14 06:32:07
回答 2查看 1.5K关注 0票数 3

这两种方法有区别吗?

例如,

代码语言:javascript
复制
from datetime import date
today = date(2012, 10, 13)
repr(today)
'datetime.date(2012, 10, 13);

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

它们似乎做了同样的事情,但为什么有人想要使用后者而不是常规的repr?

EN

回答 2

Stack Overflow用户

发布于 2012-10-14 06:53:55

repr()使用__repr__ method实现自定义结果。由repr()str()使用(如果未定义__str__ )。您不应该显式调用__repr__

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

代码语言:javascript
复制
>>>> 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')
>>>>
票数 11
EN

Stack Overflow用户

发布于 2012-10-14 06:34:18

这是一回事

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

代码语言:javascript
复制
def repr(obj):
    return obj.__repr__()

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12877619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档