Столкнулся со следующим:
>>> class A:
... def __str__(self):
... return "some A()"
...
>>> class B(A):
... def __str__(self):
... return "some B()"
...
>>> print A()
some A()
>>> print B()
some B()
>>> A.__str__ == B.__str__
False # seems reasonable, since each method is an object
>>> id(A.__str__)==id(B.__str__)
True # what?!
Что продолжается здесь?
При оценке строки 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
Следующие работы:
>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False