Как отличить неклассовые объекты python от объектов класса

Я новичок в питоне. Я думаю, что у неклассовых объектов нет атрибута 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, особенно во втором случае. .

Я делал что-то не так? Или я не правильно понял?


person metalogic    schedule 03.03.2011    source источник
comment
Я не понимаю, о чем вы спрашиваете. Может быть, нужен пример?   -  person Rafe Kettler    schedule 03.03.2011
comment
Почему вам нужно заботиться об этом?   -  person Ignacio Vazquez-Abrams    schedule 03.03.2011
comment
Прикомандирован. Забота об этом противоречит одной из целей, для которых был разработан Python.   -  person rossipedia    schedule 03.03.2011


Ответы (2)


Как спросили комментаторы: зачем вам это? Обычно это признак того, что Python используется не так, как предполагалось.

Очень мощной концепцией Python является утка ввод. Вы не заботитесь о типе или классе объекта, пока он предоставляет необходимые вам атрибуты.

person jammon    schedule 03.03.2011

как насчет inspect.isclass(имя объекта)?

больше информации здесь: http://docs.python.org/library/inspect.html

person mix    schedule 03.03.2011