Python对象.__ repr __(self)应该是一个expression式?

我正在查看Python文档中的内build对象方法,并对object.__repr__(self)的文档感兴趣。 这就是它说的:

由repr()内置函数和string转换(反引号)调用来计算对象的“官方”string表示forms。 如果可能的话,这应该看起来像一个有效的Pythonexpression式,可以用来重新创build一个具有相同值的对象(给定一个适当的环境)。 如果这是不可能的,应该返回一个<…一些有用的描述…>forms的string。 返回值必须是一个string对象。 如果一个类定义了repr ()而不是str (),那么当需要该类的实例的“非正式”string表示时, repr ()也会被使用。

这通常用于debugging,因此重要的是表示信息丰富和明确

对我来说最有趣的部分是…

如果可能的话,这应该看起来像一个有效的Pythonexpression式,可以用来重新创build一个具有相同值的对象

…但我不确定这到底是什么意思。 它说它应该看起来像一个expression式,可以用来重新创build对象,但这是否意味着它应该只是一个可以使用的expression式的例子,或者它应该是一个实际的expression式,可以被执行(eval等等)重新创build对象? 或者……应该只是为了纯粹的信息目的而重新使用实际的expression方式呢?

总的来说,我有点困惑,至于我应该放在这里。

 >>> from datetime import date >>> >>> repr(date.today()) # calls date.today().__repr__() 'datetime.date(2009, 1, 16)' >>> eval(_) # _ is the output of the last command datetime.date(2009, 1, 16) 

输出是一个可以被python解释器parsing的string,并产生一个相等的对象。

如果这是不可能的,它应该以<...some useful description...>的forms返回一个string。

它应该是一个Pythonexpression式,在eval'd中创build一个与这个属性完全相同的对象。 例如,如果您有一个包含两个整数(分子和分母)的Fraction类,则__repr__()方法将如下所示:

 # in the definition of Fraction class def __repr__(self): return "Fraction(%d, %d)" % (self.numerator, self.denominator) 

假设构造函数采用这两个值。

指南:如果你能简洁地提供一个确切的表示把它格式化为一个Pythonexpression式 (这意味着它可以被评估并直接复制到源代码中,在正确的上下文中)。 如果提供不准确的表示 ,请使用<...>格式

对于任何值都有许多可能的表示,但是对于Python程序员来说最有意思的是表示重新创build值。 请记住, 那些理解Python的人是目标受众 – 这也是为什么不精确的表示应该包含相关的上下文的原因。 甚至<XXX object at 0xNNN>的默认<XXX object at 0xNNN> ,虽然几乎完全无用,仍然提供types, id() (区分不同的对象),并指示没有更好的表示forms可用。

“但这是否意味着它应该只是您可以使用的那种expression的一个例子,或者它应该是一个实际的expression式,可以被执行(eval等等)来重新创build对象?或者…应该是只是为了纯粹的信息目的而重新使用实际的expression方式?“

哇,这是很多的手。

  1. 一个“你可以使用的expression式的例子”不会是一个特定对象的表示。 这不是有用的或有意义的。

  2. “一个实际的expression,那可以…重新创build对象”和“重新使用[创build对象]的实际expression”之间的区别是什么? 两者都是创build对象的expression式。 这些之间没有实际的区别。 repr调用可能会产生新的expression式或原始expression式。 在许多情况下,他们是一样的。

请注意,这并不总是可行的,实际的或可取的。

在某些情况下,您会注意到repr()会显示一个string,显然不是任何forms的expression式。 您定义的任何类的默认repr()作为expression式是没有用的。

在某些情况下,对象之间可能有相互(或循环)的引用。 那个纠结的层级的repr()是没有意义的。

在很多情况下,一个对象是通过一个parsing器递增构build的。 例如,从XML或JSON什么的。 repr是什么? 原始的XML或JSON? 显然不是,因为他们不是Python。 这可能是一些生成XML的Pythonexpression式。 但是,对于一个巨大的XML文档,可能不可能编写一个与parsingXMLfunction相当的Pythonexpression式。

和平:),

这可能是有用的: http : //www.rafekettler.com/magicmethods.html

我认为这里的混乱根源于英语。 我的意思是__repr__() ; 我估计价值的“表象”的简称,就像@ S.Lott所说的那样

“实际expression式,可以重新创build对象”和“重新使用[创build对象]的实际expression式”之间的区别是什么?两者都是创build对象的expression式。实际的区分,repr调用可以产生一个新的expression式或者原始的expression式,在很多情况下它们是相同的。

但在某些情况下,它们可能会有所不同。 例如; 坐标点,您可能需要c.coordinate返回: 3,5c.__repr__返回Coordinate(3, 5) 。 希望更有意义…