所以我有一个点类和一个行类都有一个缩放方法。
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
答案 0 :(得分:2)
在__init__
的{{1}}方法中,您将名称Line
和self.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, p1
对point0
。 point1
和Point
的行实例值指向适当的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}}