Форум сайта python.su
Добрый день! Недавно начал изучать Питон, и возник такой нубский вопрос:
Есть класс R_PRectangle, у которого атрибуты - четыре набора координат (задаются списками с 2-мя значениями) и имя. Сначала я создаю объект класса R1, задаю ему координаты, потом с помощью специальной функции отображаю значения координат и имя - всё отображается корректно. Потом создаю объект R2 с другими значениями атрибутов, с помощью команды отображаю содержимое - снова всё в порядке.
Но когда после этого я проверяю предыдущий объект R1, выясняется, что его координаты почему-то затёрлись и стали такими, как у R2 - хотя имя сохраняется прежним. В чём может быть подвох?
Код:
class R_PRectangle: name = "" p1 = [0, 0] p2 = [0, 0] p3 = [0, 0] p4 = [0, 0] def __init__(self, p1, p2, p3, p4, name): self.p1[0] = p1[0] self.p1[1] = p1[1] self.p2[0] = p2[0] self.p2[1] = p2[1] self.p3[0] = p3[0] self.p3[1] = p3[1] self.p4[0] = p4[0] self.p4[1] = p4[1] self.name = name print("Rectangle %s at p1%s, p2%s, p3%s, p4%s is ready." % (self.name, self.p1, self.p2, self.p3, self.p4)) def show(self): print("\nShowing rectangle ", self.name) print("Pt1: %s\nPt2: %s\nPt3: %s\nPt4: %s\n" % (self.p1, self.p2, self.p3, self.p4)) #Testing area R1 = R_PRectangle([5, 5], [12, 5], [12, 12], [5, 12], "R1") R1.show() R2 = R_PRectangle([120, 120], [180, 120], [180, 140], [120, 140], "R2") R2.show() R1.show()
Rectangle R1 at p1[5, 5], p2[12, 5], p3[12, 12], p4[5, 12] is ready. Showing rectangle R1 Pt1: [5, 5] Pt2: [12, 5] Pt3: [12, 12] Pt4: [5, 12] Rectangle R2 at p1[120, 120], p2[180, 120], p3[180, 140], p4[120, 140] is ready. Showing rectangle R2 Pt1: [120, 120] Pt2: [180, 120] Pt3: [180, 140] Pt4: [120, 140] Showing rectangle R1 Pt1: [120, 120] Pt2: [180, 120] Pt3: [180, 140] Pt4: [120, 140]
Отредактировано Otkrove (Март 10, 2018 12:10:54)
Офлайн
Не там определил переменные. Нужно прямо в __init__() создавать списки. Иначе создаются переменные класса, которые потом во все экземпляры класса передаются. Список из одного экземпляра является общим с другим экземпляром.
Отредактировано py.user.next (Март 10, 2018 12:22:21)
Офлайн
Перенес списки в __init__(), заработало. Благодарю за помощь!
Офлайн