Модель данных Python: снова перепутан с методом классов

Говорят, что:

Когда он даст объект метода класса, он преобразуется в связанный пользовательский объект метода, чьи атрибуты im_class и im_self являются C.

в ссылке

И я сделал EX.

>>> class C(object) :
...     @classmethod
...     def cm(cls) : print cls
... 
>>> C.cm
<bound method type.cm of <class '__main__.C'>>
>>> C.cm.im_self
<class '__main__.C'>
>>> C.cm.im_class
<type 'type'>

Мне нетрудно понять это явление. Но, к сожалению, в ссылке сказано, что im_self должно быть таким же, как im_class. Как объяснить несоответствие?

1 ответ

Решение

Я читаю это так же, как и ты. Похоже, что то, что фактически делает Python, не совсем то, что написано в документации.

Это устанавливает im_self в класс, и im_class к типу класса, т. е. его метаклассу. Метакласс по умолчанию для классов в Python type, Это аналогично тому, что происходит с методами, которые связаны с экземплярами: im_self это случай и im_class это тип экземпляра. В случае @classmethodдругими словами, класс обрабатывается как экземпляр (который он есть; это экземпляр type).

Возможно, поведение было изменено без обновления документации, или документация была просто неправильной с самого начала. Я пишу документацию для жизни и могу подтвердить, что практически невозможно сохранить ее на 100% правильной для чего-то такого же размера, как Python - особенно для таких неясных деталей, как эта.

Разработчики Python имеют процедуру сообщения об ошибках в документации. Попробуйте!

Другие вопросы по тегам