Поиск атрибутов объектов в Python нетривиальен. Но методы экземпляра, конечно, не хранятся в экземпляре объекта!
Поведение по умолчанию для доступа к атрибутам - это получение, установка или удаление атрибута из словаря объекта. Например,
blockquote>a.x
имеет цепочку поиска, начиная сa.__dict__['x']
, затемtype(a).__dict__['x']
и продолжается через базовые классыtype(a)
, исключая метаклассы.( docs )
Обратите внимание, что есть , чтобы сохранить функцию в экземпляре. Но это не метод экземпляра! Когда интерпретатор ищет атрибут и обнаруживает, что он (a) является функцией и (b) для объекта класса, он автоматически переносит его в объект связанного метода, который передает
self
.Есть ли способ посмотреть (и, возможно, изменить) имена и ссылки на методы экземпляра?
blockquote>Ну, вы можете, конечно, изменить объект класса после его определения. Но я предполагаю, что вы имеете в виду: «Можете ли вы сделать метод
x
конкретного экземпляра конкретного сделать что-то другое?»Это Python, ответ «да»: просто определите
a.x
как некоторую новую функцию. Затем вы получите эту функцию, прежде чем смотреть на класс.Это может вызвать у вас много путаницы, когда вы пытаетесь понять код!