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方式?“
哇,这是很多的手。
-
一个“你可以使用的expression式的例子”不会是一个特定对象的表示。 这不是有用的或有意义的。
-
“一个实际的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,5
但c.__repr__
返回Coordinate(3, 5)
。 希望更有意义…