При оценке строки id(A.__str__) == id(B.__str__)
создается A.__str__
, берется ее идентификатор, а затем собирается мусор. Затем создается B.__str__
, и в конечном итоге он попадает на тот же адрес, по которому был A.__str__
ранее, поэтому он получает (в CPython) тот же идентификатор.
Попробуйте назначить A.__str__
и B.__str__
временным переменным, и вы увидите что-то другое:
>>> f = A.__str__
>>> g = B.__str__
>>> id(f) == id(g)
False
Для более простого примера этого явления попробуйте:
>>> id(float('3.0')) == id(float('4.0'))
True