@lutlk

Как сделать экземпляр класса изменяемым объектом в Python?

Здрасьте, я изучаю ООП в Python, но у меня назрел один вопрос:
class Query:
    def __init__(self, stack):
        self.arr = stack

    def __add__(self, query):
        return Query(self.arr + query.arr)

    def __str__(self):
        return '[' + ' -> '.join([str(x) for x in self.arr]) + ']'


qr_1 = Query([1, 2, 3])
qr_2 = qr_1
qr_1 = qr_1 + Query([10, 12])
print(qr_1)  # [1 -> 2 -> 3 -> 10 -> 12]
print(qr_2)  # [1 -> 2 -> 3]

В вышеприведённом коде qr_1 присваивается 10 и 12, но никак не qr_2, хотя я приравнивал qr_2 к qr_1.
Отсюда вопрос: можно ли как-то сделать мой класс изменяемым, т.е. чтобы после приравнивания одного экземпляра к другому первый изменялся вместе со вторым?
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
В __add__ вы создаете новый экземпляр класса как Query так и list , и присваиваете qr_1 и если сравнить id то они тоже будут разными
и выглядит что вам надо сделать так
def __add__(self, query):
        self.arr.extend(query.arr)
        return self
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@bbkmzzzz
qr_1 = Query([1, 2, 3]) # создан экземпляр Query (условно id = 0)), создана ссылка на него qr_1 
qr_2 = qr_1  # создана ссылка на объект Query  (id=0), qr_2 

qr_1 = qr_1 + Query([10, 12])
# создан экземпляр Query([10, 12] (условно id=1)), вызван метод __add__ объекта по ссылке qr_1, тот,
#который id=0, 
#__add__ вернул НОВЫЙ экземпляр Query id=2, которому была присвоена ссылка с именем qr_1
#id=1 уничтожен, так как на него никто не ссылается

print(qr_1)  # [1 -> 2 -> 3 -> 10 -> 12]  # выводим в консоль объект id=2
print(qr_2)  # [1 -> 2 -> 3] # # выводим в консоль объект id=0, ссылка то осталась, объект не менялся

UPD:
class Query:
    instance_test_id = -1
    def __init__(self, stack):
        self.test_id = Query.instance_test_id + 1
        Query.instance_test_id += 1
        self.arr = stack

    def __add__(self, query):
        return Query(self.arr + query.arr)

    def __str__(self):
        return '[' + ' -> '.join([str(x) for x in self.arr]) + ']'


qr_1 = Query([1, 2, 3]) 
print(qr_1, f"test_id={qr_1.test_id}") #>> [1 -> 2 -> 3] test_id=0

qr_2 = qr_1
print(qr_2, f"test_id={qr_2.test_id}")  #>> [1 -> 2 -> 3] test_id=0

qr_1 = qr_1 + Query([10, 12])
print(qr_1, f"test_id={qr_1.test_id}")  #>> [1 -> 2 -> 3 -> 10 -> 12] test_id=2
print(qr_2, f"test_id={qr_2.test_id}")  #>> [1 -> 2 -> 3] test_id=0
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы