Уведомления

Группа в Telegram: @pythonsu

#1 Март 10, 2018 12:10:04

Otkrove
Зарегистрирован: 2018-03-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание нового объекта класса затирает атрибуты предыдущего

Добрый день! Недавно начал изучать Питон, и возник такой нубский вопрос:

Есть класс 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)

Офлайн

#2 Март 10, 2018 12:20:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10003
Репутация: +  857  -
Профиль   Отправить e-mail  

Создание нового объекта класса затирает атрибуты предыдущего

Не там определил переменные. Нужно прямо в __init__() создавать списки. Иначе создаются переменные класса, которые потом во все экземпляры класса передаются. Список из одного экземпляра является общим с другим экземпляром.



Отредактировано py.user.next (Март 10, 2018 12:22:21)

Офлайн

#3 Март 10, 2018 12:26:32

Otkrove
Зарегистрирован: 2018-03-10
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Создание нового объекта класса затирает атрибуты предыдущего

Перенес списки в __init__(), заработало. Благодарю за помощь!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version