Модель данных 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 имеют процедуру сообщения об ошибках в документации. Попробуйте!