Почему «is» не работает при сравнении методов экземпляра в python

Я заметил, что иногда методы экземпляра не сравниваются как идентичные (использование is not than == ), даже если они относятся к одному и тому же методу связанных экземпляров, например

 >>> class A(object): ... def f(self): ... print "hi" ... >>> a = A() >>> f1 = af >>> f2 = af >>> f1 is f2 False >>> f1 == f2 True 

Я закончил использовать == чтобы проверить, ссылаются ли две переменные на один и тот же метод привязки, но мне было интересно, знает ли кто, почему это не ведет себя так, как я ожидал бы?

    методы реализованы как дескрипторы. Поэтому каждый раз, когда вы обращаетесь к f члену, создается новая функция. Вы можете видеть это, глядя на их идентификаторы …

     >>> class A(object): ... def f(self): ... pass ... >>> a = A() >>> f1 = af >>> f2 = af >>> id(f1) 4325305232 >>> id(f2) 4325818528 

    Чтобы быть более понятным, что я имею в виду, когда говорю, что они реализованы через дескрипторы, следующие выражения:

     a = A() func = af 

    эквивалентны:

     a = A() func = Af__get__(a, A) 

    Ясно, что вы не хотите писать последнее все время, поэтому ярлык довольно приятный :-).

    С учетом сказанного это начинает объяснять, как связанный метод знает, что такое self , поскольку (который является self в методе) передается __get__ что и __get__ метод bound.