Я новичок в питоне. Я думаю, что у неклассовых объектов нет атрибута bases, тогда как у классовых объектов он есть. Но я не уверен. Как python\cpython проверяет, является ли объект не классом или классом, и соответственно передает правильные аргументы в атрибут дескриптора объекта во время доступа к атрибуту?
============================================
обновлено:
Я изучал, как __getattribute__
и дескриптор взаимодействуют друг с другом для создания ограниченных методов. Мне было интересно, как объект класса и объект, не относящийся к классу, по-разному вызывает дескриптор __get__
. Я думал, что эти два типа объектов используют одну и ту же функцию __getattribute__
CPython, и эта же функция должна знать, является ли вызываемый объект классом или не классом. Но я был неправ. Эта статья объясняет это хорошо:
http://docs.python.org/dev/howto/descriptor.html#functions-and-methods
Таким образом, объект класса использует type.__getattribute__
, тогда как объект, не относящийся к классу, использует object.__getattribute__
. Это разные функции CPython. И super также имеет третью реализацию __getattribute__
CPython.
Однако о супер в приведенной выше статье говорится, что: цитата и цитата
Объект, возвращаемый super(), также имеет собственный метод _getattribute_() для вызова дескрипторов. Вызов super(B, obj).m() ищет в obj._class_._mro_ базовый класс A, следующий сразу за B, а затем возвращает A._ dict_['m']._get_(obj, A). Если это не дескриптор, m возвращается без изменений. Если нет в словаре, m возвращается к поиску с помощью object._getattribute_().
Утверждение выше, похоже, не соответствовало моему эксперименту с Python3.1. То, что я увидел, является разумным для меня:
super(B, obj).m ---> A.__dict__['m'].__get__(obj, type(obj))
объектный класс = тип (объект)
super(B, objclass).m ---> A.__dict__['m'].__get__(None, objclass)
A никогда не передавался __get__
Для меня это разумно, потому что я считаю, что цепочка mro objclass (а не A) нужна внутри m, особенно во втором случае. .
Я делал что-то не так? Или я не правильно понял?