TGViewer
Библиотека питониста | Python, Django, Flask Библиотека питониста | Python, Django, Flask @pyproglib · 37.4K subscribers
Post #7678 2.47K
🐍 Python Internals: в чём разница между `.__getitem__()`, `.__getattr__()`, `.__getattribute__()` и `.__get__()`

Если вы когда-либо работали с Python internals, создавали собственные классы, ORM, прокси-объекты, lazy loading или просто пытались понять, как работает доступ к атрибутам — этот разбор обязателен к прочтению.

На первый взгляд все эти dunder-методы выглядят одинаково: они что-то «получают» (`get`). Но в действительности каждый отвечает за отдельный механизм Python.

1️⃣ .__getitem__()

Этот метод вызывается, когда вы используете квадратные скобки:

obj[key]


Python автоматически превращает это в:

obj.__getitem__(key)


Именно поэтому списки, словари, строки и кастомные контейнеры умеют работать через индекс или ключ.

Например, можно создать класс, который:
• принимает несколько ключей сразу
• ограничивает доступ к данным
• меняет поведение индексации
• реализует собственную логику выборки

2️⃣ .__getattribute__()

Каждый раз, когда вы пишете:

obj.attribute


Python ВСЕГДА сначала вызывает:

obj.__getattribute__("attribute")


Именно этот метод решает:
— является ли объект data descriptor
— есть ли attribute у экземпляра (`instance.__dict__`)
— существует ли non-data descriptor
— есть ли атрибут у класса
— нужно ли запускать fallback-механизм

⚠️ Переопределять .__getattribute__() нужно крайне осторожно — легко сломать доступ ко всем атрибутам объекта.

3️⃣ .__getattr__()

Этот метод вызывается только если Python не нашёл атрибут обычным способом.

Например:

obj.username


Если username не существует, Python попробует:

obj.__getattr__("username")


Это полезно для:
• lazy loading
• динамических атрибутов
• delegation/proxy objects
• ORM-моделей
• API wrappers

Например, можно автоматически брать значения из словаря:

obj.name


вместо:

obj["name"]


4️⃣ .__get__()

Самый недооценённый механизм Python.

Если класс реализует:

__get__()


то он становится descriptor.

Descriptors лежат в основе:
• @property
• bound methods
• classmethod
• staticmethod
• ORM field systems (Django, SQLAlchemy)
• validation frameworks

Python использует descriptors буквально повсюду.

🔥 Порядок поиска атрибута в Python

Когда вызывается:

obj.attribute


Python проверяет:
1. Data descriptor (`__get__ + __set__`)
2. Instance attribute (`obj.__dict__`)
3. Non-data descriptor (`__get__`)
4. Class attribute
5. .__getattr__() как fallback

📍 Навигация: Вакансии • Задачи • Собесы

Библиотека питониста

#буст
  • 👍 7
  • ❤ 6
More from @pyproglib
  1. Sep 20, 2026👻 94% токенов уходят не на код Анализ запусков показал: основная часть токенов уходит на…
  2. Sep 19, 2026📚Напоминаем про наш полный курс «Самоучитель по Python для начинающих» Мы написали и собр…
  3. Sep 15, 2026😭 Как не потратить недельный лимит AI-кодинга за три дня? Разберём на вебинаре, как трати…
  4. Sep 15, 2026⏱️ Справочник по Big-O в Python Для тех, кто хочет писать не просто работающий, а эффектив…
  5. Sep 14, 2026🤪 Если бы можно было задать один вопрос про AI в разработке — что бы вы спросили? Как выб…
  6. Sep 13, 2026🌸 Вселенная намекает: пора уже начать этот курс С 14 сентября цены в Proglib Academy выра…
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 →