Как отличить не-классные объекты Python от классовых объектов - PullRequest
2 голосов
/ 03 марта 2011

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

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

Ответы [ 2 ]

1 голос
/ 03 марта 2011

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

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

0 голосов
/ 03 марта 2011

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

подробнее здесь: http://docs.python.org/library/inspect.html

...