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