2017-09-26 34 views
0

这可能看起来像一个非常微不足道的问题,但我刚开始学习python类和对象。我有一个像下面的代码。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) 粒子阵列 - 在0x7ff09f00a550 intersection.Point对象,intersect.Point对象在0x7ff09f00a410,intersection.Point对象在0x7ff09f00a590

我的问题是为什么在打印对象时获取值时,将对象的地址分配给数组? 有人可以建议一种方法来获取由main函数中的数组返回的值吗?

回答

0

更详细的解释。当你print对象作为一个单独的Python 2中的print语句或Python 3中的print()函数的参数,在打印出对象之前,Python会在对象上调用str

当你把该对象的容器内就像一个列表,并print列表,列表中得到str呼吁,但它反过来调用repr每个它所包含的项目,而不是str的。要理解为什么,请查看列表[1, '2, 3', 4],并想象如果打印时引号未包含在输出中,它会是什么样子。引号是'2, 3'字符串的repr的一部分。

因此,为了使你的班上做你想要的方式,无论是你的__str__方法重新命名为__repr__(这也将努力为str电话,因为__str__默认实现是调用__repr__),或者添加附加__repr__方法。有时,有一个__repr__可以返回一个比__str__更不明确的字符串(例如,它可以命名类以及参数)。一个常见的约定是使__repr__返回一个字符串,该字符串可以是eval以再次获得等效对象。为了您的课,可能是这样的:

def __repr__(self): 
    return "{}({!r}, {!r})".format(type(self).__name__, self.x, self.y) 

我也建议使用字符串格式化像这样(或称老%s风格,如果你喜欢),而不是串联很多串在一起,以建立您的结果。

+0

非常感谢你解释得非常好! – buddingengineer

+0

很高兴帮助。我编辑修复了一些拼写错误,而当我处于这种状态时,最终又添加了一些更新,甚至还有一些示例代码,因此请确保查看最新版本。 – Blckknght

0

Python容器,例如清单打印他们的内容时,不是他们__str__使用对象__repr__方法,定义__repr__代替:

def __repr__(self): 
    return '('+str(self.x)+','+str(self.y)+')' 

如果你想的__repr__ VS __str__see here

+0

感谢您的输入! @Blckknght – buddingengineer