这可能看起来像一个非常微不足道的问题,但我刚开始学习python类和对象。我有一个如下代码。
class Point(object):
def __init__(self,x,y):
self.x = float(x)
self.y = float(y)
def __str__(self):
return '('+str(self.x)+','+str(self.y)+')'
def main():
p1 = Point(pt1,pt2)
p2 = Point(pt3,pt4)
p3 = Point(pt5,pt6)
p4 = Point(pt7,pt8)
parray = [p1,p2,p3,p4]
print " Points are", p1,p2,p3,p4
print "parray",parray
我得到以下输出:
积分是(4.0,2.0)(4.0,8.0)(4.0,-1.0)(100.0,1.0) parray - intersection.Point对象位于0x7ff09f00a550,intersection.Point对象位于0x7ff09f00a410,intersection.Point对象位于0x7ff09f00a590
我的问题是,当我在打印对象时获取值时,为什么分配给数组的对象的地址? 有人可以建议一种方法来获取main函数中数组中返回的值吗?
答案 0 :(得分:0)
Python容器,例如列表在打印内容时使用对象__repr__
方法,而不是__str__
,而是定义__repr__
:
def __repr__(self):
return '('+str(self.x)+','+str(self.y)+')'
如果您想要更详细地解释__repr__
vs __str__
see here
答案 1 :(得分:0)
当您print
一个对象作为Python 2中print
语句或Python 3中print()
函数的单独参数时,Python会先调用该对象上的str
打印出来。
当您将对象放入容器(如列表)和print
列表中时,列表会在其上调用str
,但它会在每个项目上调用repr
它包含,而不是str
。要理解原因,请查看列表[1, '2, 3', 4]
并想象如果打印时输出中没有包含引号,它会是什么样子。引号是'2, 3'
字符串的repr
。
为了让您的课程以您想要的方式运作,请将__str__
方法重命名为__repr__
(这也适用于str
次调用,因为{{1}的默认实现}}是调用__str__
),或添加其他__repr__
方法。有时让__repr__
返回比__repr__
更不明确的字符串是有用的(例如,它可能将类命名为参数)。一个常见的约定是让__str__
返回一个可以__repr__
的字符串,以便再次获得一个等效对象。对于你的班级,这看起来像:
eval
我还建议使用这样的字符串格式(如果您愿意,可以使用较旧的def __repr__(self):
return "{}({!r}, {!r})".format(type(self).__name__, self.x, self.y)
样式),而不是将大量字符串连接在一起以构建结果。