TGViewer
DevFM DevFM @devfm · 3.05K subscribers
Post #163 1.11K
Хитрости __getattr__
В примере выше мы создаём класс Users, который, по сути, скрывает внутри обычный список пользователей.

Для получения первого и последнего пользователя потребуется писать self.users[0] и self.users[-1]. Такие конструкции раскрывают внутреннее устройство класса, загрязняют код и делают его менее читабельным. Мы заставляем внешнего потребителя класса разбираться в его внутреннем устройстве.

Один из вариантов решения — декоратор @property и создание нужных атрибутов. Но для большого количества атрибутов будет спагетти из однотипных property.

Другой приём — использование динамических атрибутов. Создаём словарь, где ключом будет имя, а значением индекс в списке пользователей. Метод getattr проверяет наличие искомого атрибута среди ключей словаря, если такой есть — то возвращает пользователя по индексу из словаря.

Детали решения
Почему первый print выведет U1?
Вся суть в том, как python ищет атрибуты. Атрибут ищется в классе. В нашем случае атрибута first нет. Далее производится поиск по иерархии наследования, и тоже безуспешно. Только в этом случае вызывается магический метод __getattr__, и параметром ему передаётся имя аргумента в виде строки "first". По словарю first превратится в нулевой индекс из self.users, что соответствует выводу U1.

Почему второй print выведет new_user?
В 17 строке явно создаем атрибут first и присваиваем ему значение new_user. В 18 строке в классе будет найден атрибут first и метод getattr не будет вызываться.

Обратите внимание ещё на одну интересность. Вывод self.users.users[0] всё ещё даст U1. Получается некая несогласованность. Мы переопределили first, и это уже не первый пользователь.

Поставьте 🔥, если интересно возможное решение такой проблемы.
  • 🔥 36
  • ❤ 3
  • ⚡ 2
  • 👍 1
  • 🌭 1
More from @devfm
  1. Sep 30, 2026Когда агенту нужен браузер Словил удивительное поведение в Codex: при работе с браузером п…
  2. Sep 27, 2026Багфикс по расписанию AI врывается в разные этапы SDLC. Сейчас экспериментирую с автоматиз…
  3. Sep 25, 2026Попробуйте Herdr По долгу службы я использую самые разные инструменты и какое-то время экс…
  4. Sep 19, 2026ММММолния! В последнем обновлении Claude Code добавили поддержку AGENTS.md! Это настоящий…
  5. Sep 17, 2026Код пишется быстро, а што с ревью Я как-то уже бухтел на тему код-ревью. Но мир так быстро…
  6. Sep 15, 2026Не пишите аислопный текст, пожалуйста-препожалуйста. Код супер активно пишется агентами и…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →