@MasterCopipaster

Почему свойства экземпляра класса не являются изолироваными в данном примере?

У меня вопрос, почему данный код работает так как он работает?

class B:
    prop = ''


class A:
    __data = []

    def set(self, b: B):
        self.__data.append(b)

    def display(self):
        for data in self.__data:
            print(data.prop)
        print('------------------')


obj_one = A()
obj_two = A()
b_one = B()
b_two = B()
b_one.prop = 'one'
b_two.prop = 'two'

obj_one.set(b_one)
obj_two.set(b_two)

print(obj_one)
print(obj_two)

obj_one.display()
obj_two.display()


<__main__.A object at 0x7f867822bf70>
<__main__.A object at 0x7f867822be80>
one
two
------------------
one
two
------------------


Почему я создаю два разных экземпляра класса но свойство __data у них в друг почему то общие?
Это как вообще? - как сделать что бы свойства класса были изолированы друг от друга в данном примере?
Я конечно знаю что есть объекты которые передаются по ссылке, но почему тут это происходит не понимаю?
Я ожидал получить результат:
<__main__.A object at 0x7f867822bf70>
<__main__.A object at 0x7f867822be80>
one
------------------
two
------------------
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
Frostealth
@Frostealth
Backend Developer
Потому что `A::__data` ссылается на общий для всех экземпляров список. Предлагаю почитать.

Ошибка заключается в присвоении значения списка (работает так со всем) свойству класса. Другими словами, свойство класса будет содержать ссылку на объявленный список, которая будет и у экземпляров класса.
class A:
    __data = []  // список будет общий для всех экземпляров класса A


Присвоить значение непосредственно экземпляру класса можно в методе `__init__`
class A:
    def __init__(self):
        self.__data = []
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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