gpt4 book ai didi

python - 构造函数覆盖已创建对象的先前值

转载 作者:太空宇宙 更新时间:2023-11-04 09:03:49 24 4
gpt4 key购买 nike

我对 Python 比较陌生。我在一个项目中工作,以创建对象 Square 和 Points。一个正方形由左上角、右上角等4个点组成。

现在在我的主函数中我创建了 4 个点对象并将它们发送到 Square 类的构造函数,它创建了我的 Square。

当我对另一个具有不同点对象值的 Square 执行相同操作时,我之前创建的 Square 的值将被覆盖,所以最后我有两个相同的对象。你知道为什么会这样吗?

这是我的代码:

class Point(object):
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y

class Square(object):
ul = Point()
ll = Point()
ur = Point()
lr = Point()
def __init__(self, ul, ll, ur, lr):
self.ul.x = ul.x
self.ll.x = ll.x
self.ur.x = ur.x
self.lr.x = lr.x
self.ul.y = ul.y
self.ll.y = ll.y
self.ur.y = ur.y
self.lr.y = lr.y

def main():
ul1 = Point(1, 2)
ll1 = Point(1, 1)
ur1 = Point(2, 2)
lr1 = Point(2, 1)
s1 = Square(ul1, ll1, ur1, lr1)

ul2 = Point(3, 3)
ll2 = Point(3, 2)
ur2 = Point(4, 3)
lr2 = Point(4, 2)
s2 = Square(ul2, ll2, ur2, lr2)

#At this point s1 and s2 have the same values...

if __name__ == '__main__':
main()

我们将不胜感激任何形式的帮助 ;)

干杯!

最佳答案

发生这种情况是因为您已将 Square 类中的四个角变量定义为类变量。这意味着它们在该类的所有实例之间共享。

这是您的 Square 类的简洁版本。有实例变量self.ul、self.ll等。您不需要在 __init__ 中为它们指定一个 Point 实例,因为您已经在将它们作为参数传递的主函数中这样做了。

class Square(object):
def __init__(self, ul, ll, ur, lr):
self.ul = ul
self.ll = ll
self.ur = ur
self.lr = lr

def main():
s1 = Square(Point(1, 2), Point(1, 1), Point(2, 2), Point(2, 1))
s2 = Square(Point(3, 3), Point(3, 2), Point(4, 3), Point(4, 2))
print s1.ul.x # 1
print s1.lr.y # 2

HyperBoreus 在将点作为参数传递方面提出了一个很好的观点,就好像您将同一个点对象传递给两个方 block 并对其进行修改一样,您所做的任何更改都会反射(reflect)在两个方 block 中。

您可以通过将角值传递给 __init__ 而不是 Point 对象来解决这个问题,然后在 __init__ 中创建实例

这是一个完整的例子:

class Point(object):
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y

class Square(object):
def __init__(self, ul, ll, ur, lr):
self.ul = Point(ul[0], ul[1])
self.ll = Point(ll[0], ll[1])
self.ur = Point(ur[0], ur[1])
self.lr = Point(lr[0], lr[1])

def main():
square_one = Square((1, 2), (1, 1), (2, 2), (2, 1))
square_two = Square((3, 3), (3, 2), (4, 3), (4, 2))

我还建议您使用更具可读性的变量名。将 upper_right 缩短为 ur 不会节省任何费用。相反,当你一年后回到这段代码时,你会诅咒自己。

关于python - 构造函数覆盖已创建对象的先前值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22821475/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com