Python 报告方法的目的? def\uuu repr\uu(自): 返回“”%( self.\uuuuu类\uuuuuu.\uuuuuu名称,self.urlconf\u名称,self.app\u名称, self.namespace、self.regex.pattern)
这种方法的意义/目的是什么?这在以下章节中得到了很好的解释: repr(对象):返回包含对象可打印表示形式的字符串。这与转换(反向引号)产生的值相同。能够作为普通函数访问此操作有时很有用。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给Python 报告方法的目的? def\uuu repr\uu(自): 返回“”%( self.\uuuuu类\uuuuuu.\uuuuuu名称,self.urlconf\u名称,self.app\u名称, self.namespace、self.regex.pattern),python,Python,这种方法的意义/目的是什么?这在以下章节中得到了很好的解释: repr(对象):返回包含对象可打印表示形式的字符串。这与转换(反向引号)产生的值相同。能够作为普通函数访问此操作有时很有用。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给eval()时将产生一个具有相同值的对象,否则,表示是一个尖括号中的字符串,其中包含对象类型的名称以及其他信息,通常包括对象的名称和地址。类可以通过定义\uu repr\uu()方法来控制此函数为其实例返回的内容 因此,您在这里看到的是的默认实现,它对序列
eval()
时将产生一个具有相同值的对象,否则,表示是一个尖括号中的字符串,其中包含对象类型的名称以及其他信息,通常包括对象的名称和地址。类可以通过定义\uu repr\uu()
方法来控制此函数为其实例返回的内容
因此,您在这里看到的是的默认实现,它对序列化和调试非常有用。
\uuuuu repr\uuuuu
应该返回对象的可打印表示形式,这很可能是创建此对象的可能方式之一。见正式文件<代码>\uuuu repr\uuuu更适合开发人员,而\uuuuu str\uuuu
则适合最终用户
一个简单的例子:
def __repr__(self):
return '<%s %s (%s:%s) %s>' % (
self.__class__.__name__, self.urlconf_name, self.app_name,
self.namespace, self.regex.pattern)
\uuuu repr\uuu方法只是告诉Python如何打印类的对象,独立Python解释器使用该方法以可打印格式显示类。例如:
~>python3.5
Python 3.5.1(v3.5.1:37A07CEE59692015年12月5日21:12:44)
[GCC 4.2.1(苹果公司建造5666)(dot 3)]关于达尔文
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>类StackOverflowDemo:
... 定义初始化(自):
... 通过
... 定义报告(自我):
... 返回“”
...
>>>demo=StackOverflowDemo()
>>>演示
如果类中未定义\uuuuu str\uuuu
方法,它将调用\uuuuuu repr\uuu
函数以尝试创建可打印的表示
str(演示版)
''
此外,默认情况下,print()
ing类将调用\uuuu str\uuu
,如果您愿意的话,请举一个例子,看看它们之间的区别(我从中复制)
int x
的repr()
和str()
的返回值相同,但是str
y
的返回值之间存在差异——一个是正式的,另一个是非正式的。正式表示和非正式表示之间最重要的区别之一是str值的\uuu repr\uuu
的默认实现可以作为eval的参数调用,返回值将是有效的字符串对象,如下所示:
>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'
如果您试图调用
\uuuu str\uuuu
的返回值作为eval的参数,结果将无效。当我们通过定义类来创建新类型时,我们可以利用Python的某些特性使新类便于使用。这些特征之一是“特殊方法”,也称为“魔术方法”
特殊方法的名称以两个下划线开头和结尾。我们定义它们,但通常不直接用名字来称呼它们。相反,它们在特定情况下自动执行
使用print语句可以方便地输出对象实例的值。当我们这样做时,我们希望在输出中以某种可以理解的明确格式表示值。可以使用repr特殊方法来安排发生这种情况。如果我们定义这个方法,当我们打印我们为其定义这个方法的类的实例的值时,它会被自动调用。不过,应该提到的是,还有一种特殊方法,用于类似但不完全相同的目的,如果我们也对其进行了定义,它可能会获得优先权
如果我们还没有定义Point3D类的repr方法,并且已经将my_point实例化为Point3D的实例,那么我们可以这样做
打印我的U点
... 我们可以将其视为输出
不太好,嗯
因此,我们定义了repr或str特殊方法,或两者,以获得更好的输出
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
输出
(1、2、3)
(1,2,3)为您实现的每个类实现repr。不应该有任何借口。 对于您认为可读性比无歧义性更重要的类,实施str
参考此链接:lazy1:我主要想修正格式(让示例尽可能与他们在示例会话中看到的内容相匹配是很有用的),但我还调整了输出格式,使其与作业明显不同,因为这大大提高了对这一点感到困惑的人的清晰度,imho。(如果我已经做了很多,只需重新编辑,我就欠你一杯啤酒。)省略了引用:这可能应该使用%r而不是%s:这不是真的正确<代码>\uuuu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。但是,如果对象没有
\uuu str\uuu
方法,则使用\uuu repr\uu
。同样值得注意的是:此示例实际上打印了self.x
和self.y
的\uu str\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuucode>方法:%r
应该在字符串格式化操作中使用%r
,而不是%s
(因为类没有定义\uuuuuuuuuuu str uuuuuuuuuuuuuu
,实际上返回了,但这是一个异常现象).是否每个类都在python中实现了repr?我认为反引号(或“反勾号”)
>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True
**class Point3D(object):
def __init__(self,a,b,c):
self.x = a
self.y = b
self.z = c
def __repr__(self):
return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
def __str__(self):
return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**