obj.prop вызывает функцию, а C.prop возвращает объект, и откуда метод знает про selfАнтонио Куни разобрал по шагам, что происходит при обращении к атрибуту — от байткода до кода CPython. Порядок поиска на картинке.
Из него сразу объясняется несколько загадок. Дескриптор данных, то есть объект с
__get__ и __set__, проверяется раньше словаря экземпляра — поэтому property не перекрыть, положив одноимённый ключ в obj.__dict__. И property остаётся дескриптором данных, даже когда сеттера нет: он определяет __set__ и сам поднимает AttributeError.Там же видно, откуда берётся связанный метод: обычная функция — это дескриптор без записи, и
obj.meth разворачивается в C.meth.__get__(obj, C).У классов поиск устроен иначе: сначала дескрипторы данных метакласса, потом полный проход по порядку разрешения методов.
Автор берёт CPython 3.12.11: в 3.13 этот код усложнён оптимизациями.
@zen_of_python
