正如 Python 2 documentation on __repr__
所说:
那么为什么 内置的 __repr__
类 没有按照该指南采取行动?
例子
>>> class A(object):
... pass
>>> repr(A)
"<class 'A'>"
为了符合准则,默认
__repr__
应返回 "A"
,即通常 A.__name__
。为什么表现不同?我相信这将非常容易实现。编辑:“复制”的范围
我可以在答案中看到在讨论中不清楚
repr
应该返回什么。在我看来,repr
函数应该返回一个允许您重现对象的字符串:Ad.1。 看一个内置的类案例(取自 this SO question ):
>>> from datetime import date
>>>
>>> repr(date.today()) # calls date.today().__repr__()
'datetime.date(2009, 1, 16)'
显然,假设的上下文就像您使用基本导入形式,即
import datetime
,因为如果您尝试 eval(repr(date.today()))
, datetime
将不会被识别。所以重点是 __repr__
不需要从头开始表示对象 。如果它在社区同意的上下文中是明确的就足够了,例如使用直接模块的类型和函数。听起来很合理,对吧?Ad.2。 我相信,对于
repr
来说,仅仅给出如何重建对象的印象是不够的。帮助调试是 str
的目的。结论
所以我对
repr
的期望是允许我对结果执行 eval
。对于一个类,我不想获得从头开始重建类的整个代码。相反,我希望对在我的范围内可见的类有一个明确的引用。 "Module.Class"
就足够了。没有冒犯,Python,但 "<class 'Module.Class'>"
不只是削减它。 最佳答案
考虑一个稍微复杂的类:
class B(object):
def __init__(self):
self.foo=3
repr
需要返回类似的东西type("B", (object,), { "__init__": lambda self: setattr(self, "foo", 3) })
请注意一个困难:并非
def
语句定义的所有函数都可以转换为单个 lambda
表达式。稍微更改 B
:class B(object):
def __init__(self, x=2, y, **kwargs):
print "in B.__init__"
您如何编写定义
B.__init__
的表达式?你不能用lambda self: print "in B.__init__"
因为
lambda
表达式不能包含语句。对于这个简单的类,编写一个完整定义类的表达式已经是不可能的了。关于类的 Python 代表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15362183/