Поля класса в Python перезаписываются? Немного не понимаю как работают классы в Python class SimpleClass:
my_dict = {}
number = None
def return_res(self):
return self.my_dict
def __init__(self, args):
self.number = args
self.my_method()
def my_method(self):
value = self.number+10
self.my_dict.update({'key': value})
one = SimpleClass(1).return_res()
two = SimpleClass(2).return_res()
three = SimpleClass(3).return_res()
result = [one, two, three]
print(result)
Почему результат будет таким ?[{'key': 13}, {'key': 13}, {'key': 13}]
Как получить результат такой ?[{'key': 11}, {'key': 12}, {'key': 13}]

21 Авг 2019 в 06:58
165 +1
0
Ответы
1

Проблема здесь заключается в том, что вы обновляете один и тот же словарь my_dict для всех экземпляров класса SimpleClass, поэтому все они ссылаются на один и тот же словарь. Чтобы получить ожидаемый результат, нужно создавать новый словарь для каждого экземпляра класса в методе __init__.

Вот исправленный код:

class SimpleClass:
my_dict = {}
number = None
def return_res(self):
return self.my_dict
def __init__(self, args):
self.number = args
self.my_dict = {} # Создаем новый словарь для каждого экземпляра
self.my_method()
def my_method(self):
value = self.number + 10
self.my_dict.update({'key': value})
one = SimpleClass(1).return_res()
two = SimpleClass(2).return_res()
three = SimpleClass(3).return_res()
result = [one, two, three]
print(result)

Теперь каждый экземпляр класса SimpleClass содержит свой собственный словарь my_dict, и результат будет [{'key': 11}, {'key': 12}, {'key': 13}].

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир