Задать вопрос
@skyline48

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

Добрый день, изучаю ООП Python и не могу сообразить почему список в User().notes для всех один и тот же, хотя User().login разный
class User:
    def __init__(self, lgn, psw, notes=[]):
        self.login = lgn
        self.password = psw
        self.notes = notes
        self.verify = False
    def display(self):
        for idx, note in enumerate(self.notes, 1):
            print(f'{idx}. {note}')
# class Note:
#     def __init__(self, text, time=None):
#         self.text = text
#         self.time = time
class Memory:
    def __init__(self):
        self.users = []


class Enter:
    def enter(self, memory):
        while True:
            print('1. Войти')
            print('2. Зарегистрироваться')
            text = input('Выберите нужный пункт меню: ')
            if text.strip() == '1':
                self.verify(memory)
            elif text.strip() == '2':
                AddUser().add_user(memory)
            else:
                print('Неверный пункт меню!')
    def verify(self, memory):
        while True:
            login = input('Логин: ')
            for user in memory.users:
                if user.login == login.strip():
                    password = input('Пароль: ')
                    if user.password == password.strip():
                        user.verify = True
                        Menu().menu(user, memory)
                    else:
                        print('Неверный пароль!')
            print('Такого логина не существует!')
            
class Menu:
    def menu(self, user, memory):
        while True:
            print('1. Добавить заметку')
            print('2. Показать все заметки')
            print('3. Выход из профиля')
            text = input('Выберите пункт: ')
            if text.strip() == '1':
                AddNote().add_note(user)
            elif text.strip() == '2':
                user.display()
            elif text.strip() == '3':
                user.verify = False
                Enter().enter(memory)
                break
            elif text.strip() == '4':
                print(user.login, user.notes)
            else:
                print('Нет такого пункта!')
class AddNote:
    def add_note(self, user):
        while True:
            text = input('Напишите заметку: ')
            if text.strip().lower() == 'стоп':
                break
            elif text.strip():
                user.notes.append(text)
            else:
                print('Заметка пустая!')
class AddUser:
    def add_user(self, memory):
        while True:
            login = input('Логин: ')
            if not login:
                continue
            password = input('Пароль: ')
            if not password:
                continue
            user = User(login, password)
            memory.users.append(user)
            user.verify = True
            Menu().menu(user, memory)
            break
memory = Memory()
a = Enter()
a.enter(memory)
  • Вопрос задан
  • 232 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Python-разработчик: расширенный курс + нейросети
    12 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия: Python-разработчик + ИИ
    8 месяцев
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
это mutable default argument — notes=[] создаётся один раз при определении __init__, не при каждом вызове. все инстансы без явного третьего аргумента ссылаются на один и тот же список.

фикс: def __init__(self, lgn, psw, notes=None): и внутри self.notes = [] if notes is None else notes
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Maksim_64
@Maksim_64
ML Engineer
1. Почитай про свойство python объекта, мутабельность/не мутабельность.
2. Почитай про мутабельные объекты, как параметр в функции по умолчанию к чему это ведет и практики по решению проблем.
3. Примени на своем ООП коде.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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