Как Python решает, что вернуть при obj.attr? Укажи роль data/non-data дескрипторов, __getattribute__, __getattr__ и MRO.
Сначала вызывается type(obj).__getattribute__ (если переопределён — он рулит). Далее порядок:
1. Ищем data-descriptor на классе по C3 MRO (есть __set__/__delete__) → вызываем его __get__.
2. Иначе смотрим obj.__dict__.
3. Иначе ищем на классе/MRO: если non-data descriptor (функция, property без __set__ и т.п.) — вызываем __get__, иначе возвращаем значение.
4. Если не нашли — вызывается __getattr__. Итого приоритет: data-descriptor > instance dict > non-data/class attr, поиск по классам — по __mro__ (C3).
Библиотека собеса по Python
Post #1074
928
- 👍 6