@PR1YD

Как можно изменить состояние переменной класса?

У меня есть два скрипта:
parent.py
class Test:
    def __init__(self):
        self.data = {
            'name': '',
            'password': ''
        }

    def fill_data(self):
        self.data["name"] = "John"
        self.data["password"] = "1234"

    def change_data(self, name):
        self.data["name"] = str(name)


new = Test()

if __name__ == "__main__":

    new.fill_data()
    time.sleep(5)
    print(new.data)


и child.py:
from parent import new

if __name__ == "__main__":
    print(f"[child]: Before change data is {new.data}") # тут должно выводится self.data = { 'name': 
    # 'John', 'password': '1234' }, а получается self.data = { 'name': "", 'password': "" }      
    setattr(new, 'name', 'Nick') # я также использовал просто new.data["name"] = "Nick"
    print(f"[child]: After change data is {new.data}")


Проблема состоит в том, что при попытке изменения объекта new из child.py - ничего не происходит. Насколько я понимаю, это как-то связано с экземплярами класса, но моих знаний пока не хватает, чтобы разобраться самому.
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
@jottygroups
Full-Stack Django Web Developer
Ну и не должно было ничего сделаться.
При запуске child.py ты создаёшь экземпляр класса Test, у тебя инициализировался словарь data... Всё.
Я знаю, что ты хотел, чтобы выполнилось то, что ниже:
if __name__ == "__main__":
    new.fill_data()
    time.sleep(5)
    print(new.data)

Но оно так не работает. Проверка ложна. Это сработает, если ты запустишь напрямую parent.py:
python parent.py

Да и тем более ты всего лишь импортишь переменную экземпляр класса Test. Даже, если бы там был цикл while True, он бы не выполнился.
Ты пытался из child.py обратиться к new.data['name'] через setattr, но ты это сделал неверно. Ты обратился к new.name, вот и ошибка. Чтобы сделать всё правильно через setattr, надо было прописать:
setattr(new, data["name"], 'Nick')

Ответ, как правильно сделать, файл child.py
from parent import new

if __name__ == "__main__":
    new.fill_data()
    print(f"[child]: Before change data is {new.data}") # тут выведется правильная data  
    new.change_data('Nick')
    print(f"[child]: After change data is {new.data}")
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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