a == b неверно, но id (a) == id (b) верно? - PullRequest
13 голосов
/ 23 февраля 2010

Натолкнулся на следующее:

>>> 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?!

Что здесь происходит?

Ответы [ 3 ]

11 голосов
/ 23 февраля 2010

При оценке строки 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
8 голосов
/ 23 февраля 2010

работают следующие работы:

>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False
0 голосов
/ 08 мая 2014

Для тех из нас, кого привлекает ваш заголовок, определить, был ли метод переопределен:

class A:
    def __str__(self):
        return "some A()"

    def strWasOverridden(self):
        return A.__str__ != self.__str__
...