当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《Python对象.__repr__(self)应该是一个表达式?》经验,为你挑选了3个好方法。

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

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

这通常用于调试,因此表示信息丰富且明确是很重要的

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

如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象

......但我不确定这意味着什么.它说它应该看起来像一个可以用来重新创建对象的表达式,但这是否意味着它应该只是你可以使用的表达式的一个例子,或者它应该是一个可以执行的实际表达式(eval)等..)重新创建对象?或者......为了纯粹的信息目的,它应该只是重新使用的实际表达式吗?

总的来说,我对这应该放在什么地方有点困惑.



1> Georg Schöll..:
>>> 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解释器解析并产生一个相等的对象.

如果那是不可能的,它应该返回一个字符串形式<...some useful description...>.


请注意尝试让__repr __()生成一个返回对象副本的表达式的缺点:您必须假设原始包是完全导入的.如果您只运行Georg的三行,您将得到"NameError:name'datetime'未定义",因为从未导入datetime包.仅导入"datetime"中的"date".

2> Jeremy Ruten..:

它应该是一个Python表达式,当eval'd时,创建一个具有与此对象完全相同属性的对象.例如,如果您的Fraction类包含两个整数,分子和分母,则您的__repr__()方法如下所示:

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

假设构造函数接受这两个值.



3> 小智..:

准则:如果可以简洁地提供一个精确的表示,将其格式化为Python表达式(这意味着它可以是既eval'd和直接复制到源代码,在正确的上下文).如果提供不精确的表示,请使用<...>格式.

任何值都有许多可能的表示形式,但Python程序员最感兴趣的是一个重新创建值的表达式.请记住,那些了解Python的人是目标受众 - 这也是不精确表示应该包含相关上下文的原因.即使是默认值,虽然几乎完全没用,但仍然提供类型,id()(以区分不同的对象),并指示没有更好的表示可用.

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有