Python - 类和对象

时间:2017-09-26 05:23:44

标签: python-2.7

这可能看起来像一个非常微不足道的问题,但我刚开始学习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函数中数组中返回的值吗?

2 个答案:

答案 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) 样式),而不是将大量字符串连接在一起以构建结果。

相关问题