Python - 点类没有得到正确的输出

时间:2016-03-10 03:40:14

标签: python

所以我有一个点类和一个行类都有一个缩放方法。

class Point:

    def __init__(self, x, y):
        if not isinstance(x, float):
            raise Error("Parameter \"x\" illegal.")
        self.x = x
        if not isinstance(y, float):
            raise Error ("Parameter \"y\" illegal.")
        self.y = y

    def scale(self, f):
        if not isinstance(f, float):
            raise Error("Parameter \"f\" illegal.")
        self.x = f * self.x
        self.y = f * self.y

    def __str__(self):
        return '%d %d' % (int(round(self.x)), int(round(self.y)))

class Line:

    def __init__(self, point0, point1):
        self.point0 = point0
        self.point1 = point1

    def scale(self, factor):
        if not isinstance(factor, float):
            raise Error("Parameter \"factor\" illegal.")
        self.point0.scale(factor)
        self.point1.scale(factor)

    def __str__(self):
        return "%s %s" % (self.point0, self.point1)

因此,我对此代码进行的一项测试是检查我在此测试代码中执行的浅拷贝。

p0.scale(2.0)
p1.scale(2.0)
print line

问题是打印线给了我0 2 4 6它应该给我0 1 2 3.那么为什么打印2的倍数呢? scale方法应该返回缩放值,并且对于所有其他测试用例,它会打印预期值,但是只要使用此测试代码,它就会打印出我没想到的值。以下是如何设置p0和p1的值:

print '********** Line'
print '*** constructor'
p0 = Point(0.0, 1.0)
p1 = Point(2.0, 3.0)
line = Line(p0,p1)
print line

2 个答案:

答案 0 :(得分:2)

__init__的{​​{1}}方法中,您将名称Lineself.point0分配给传入的两个点。这不会制作新副本,只给内存中的对象另一个名字。如果将此方法更改为

self.point1
然后一切都应按预期工作。或者,您可以使用复制模块:

def __init__(self, point0, point1):
    self.point0 = Point(point0.x, point0.y)
    self.point1 = Point(point1.x, point1.y)

您还可以在from copy import copy class Line: def __init__(self, point0, point1): self.point0 = copy(point0) self.point1 = copy(point1) 课程中定义自己的__copy____deepcopy__方法。

Point

您可以查看this question了解详情。

答案 1 :(得分:0)

line缩放p0,p1后,将x,y对乘以p0, p1point0point1Point的行实例值指向适当的print line实例p0和p1,x,y的结果可以看到p0 = Point(0,1) p1 = Point(2,3) line = Line(p0, p1) print line # 0 1 2 3 p0.scale(2.0) p1.scale(2.0) print line # 0 2 4 6 的更新值每一点。

{{1}}