>>> b.test is a.test
False
>>> a.test is a.test
False
методы создаются на лету каждого время, когда вы их просматриваете. Объект функции (который всегда является одним и тем же объектом) реализует descriptor protocol, а его __get__
создает объект связанного метода. Нет двух связанных методов, как правило, одного и того же объекта.
>>> id(a.test) == id(b.test)
True
>>> a.test is b.test
False
Этот пример обманчив. Результатом первого является только True
по совпадению. a.test
создает связанный метод, и это мусор, собранный после вычисления id(a.test)
, потому что ссылок на него нет. (Обратите внимание, что вы цитируете документацию о том, что id является «уникальным и постоянным для этого объекта в течение его жизни» (выделение мое).) b.test
происходит, чтобы иметь тот же идентификатор, что и связанный метод, который у вас был до этого и разрешен потому что ни один другой объект не имеет того же идентификатора.
Обратите внимание, что вы должны редко использовать is
и еще реже использовать id
. id(foo) == id(bar)
всегда ошибочно.
Что касается вашего нового примера, мы надеемся, вы получите то, что он делает сейчас:
>>> new_improved_test_method = lambda: None
>>> a.test = new_improved_test_method
>>> a.test is a.test
True
В этом случае мы не делаем методы на лету из функций на классе автоматически связывании себя и возвращение связанных объектов метода. В этом случае вы просто сохраняете функцию как атрибут экземпляра. Ничего особенного не происходит при поиске (дескрипторы вызываются только при поиске атрибута класса), поэтому каждый раз, когда вы просматриваете атрибут, вы получаете исходный объект, который вы сохранили.
Это не похоже на то, что я сделал это для реальной программы или метаклассического трюка джедая, заметьте. Мне было скучно в поезде, и я пробовал это :) – badp
Я думаю, что важным вопросом является то, почему 'a.test является a.test' является False. Как только вы узнаете, что остальное должно иметь смысл ... – Skilldrick
Нефть разлива прекрасна и денди, и она приближается к городу рядом с вами.Может быть, вы должны организовать встречу, чтобы отпраздновать свое пришествие! – badp