正如 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/

    10-12 23:31