我写这段代码:
class Item:
def __init__(self, name):
self._name = name;
def __str__(self):
return "Item: %s" % self._name
Run Code Online (Sandbox Code Playgroud)
我跑的时候
print((Item("Car"),))
Run Code Online (Sandbox Code Playgroud)
输出是
(<__main__.Item object at 0x0000000002D32400>,)
Run Code Online (Sandbox Code Playgroud)
当我将代码更改为:
class Item:
def __init__(self, name):
self._name = name;
def __repr__(self):
return "Item: %s" % self._name
def __str__(self):
return "Item: %s" % self._name
Run Code Online (Sandbox Code Playgroud)
然后输出
(Item: Car,)
Run Code Online (Sandbox Code Playgroud)
所以,现在我感到困惑的区别__repr__和__str__.
Tay*_*mon 17
__str__并且__repr__都是获取对象的字符串表示的方法.__str__应该更短,更人性化,同时__repr__应该提供更多的细节.
具体来说,对于许多数据类型,__repr__返回一个字符串,如果将其粘贴回Python,则该字符串将是一个有效的表达式,其值将等于原始值.例如,str('Hello')返回'Hello',但repr('Hello')返回"'Hello'",在字符串内带引号.如果你打印出那个字符串,你就会得到'Hello',如果你把它粘贴到Python中,你就会得到原来的字符串.
某些数据类型(如文件对象)无法以这种方式转换为字符串.__repr__此类对象的方法通常在尖括号中返回一个字符串,其中包含对象的数据类型和内存地址.如果您没有专门定义__repr__方法,用户定义的类也会执行此操作.
在REPL中计算值时,Python调用__repr__将其转换为字符串.print但是,当您使用Python调用时__str__.
当你调用时print((Item("Car"),)),你正在调用类的__str__方法tuple,这与它的__repr__方法相同.该方法通过调用__repr__元组中每个项目的方法,将它们与逗号连接在一起(加上一个项目元组的尾随),并用括号括起整个事物.我不确定为什么这个__str__方法tuple不会调用__str__它的内容,但事实并非如此.
| 归档时间: |
|
| 查看次数: |
7433 次 |
| 最近记录: |