2010-02-23 15 views
13

encontré con lo siguiente:a == b es falso, pero id (a) == id (b) es verdadero?

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

lo que está pasando aquí?

Respuesta

8

las siguientes obras:

>>> id(A.__str__.im_func) == id(A.__str__.im_func) 
True 
>>> id(B.__str__.im_func) == id(A.__str__.im_func) 
False 
+0

Nota: esta respuesta sólo funciona para Python 2. – BenC

11

A medida que la cadena de id(A.__str__) == id(B.__str__) se evalúa, se crea A.__str__, su identificador tomada, y luego de basura recogidas. A continuación, se crea B.__str__, y resulta que termina en la misma dirección exacta en la que A.__str__ estaba antes, por lo que obtiene (en CPython) la misma identificación.

intente asignar A.__str__ y B.__str__ a variables temporales y verá algo diferente:

>>> f = A.__str__ 
>>> g = B.__str__ 
>>> id(f) == id(g) 
False 

Para un ejemplo más simple de este fenómeno, intente:

>>> id(float('3.0')) == id(float('4.0')) 
True 
+0

Pero entonces, ¿por qué >>> f = A .__ str__ >>> id (f) == ID (A .__ str__) Falso – Krab

+0

'A. __str__' se crea ??? No estoy seguro de esto: debe ser parte de la metaclase que genera todas las clases, es decir, su "ADN" básico. – jldupont

+2

@jldupont: Python crea los métodos independientes 'A .__ str__' y' B .__ str__' en tiempo de ejecución. http://users.rcn.com/python/download/Descriptor.htm es una buena referencia para los mecanismos subyacentes. –

0

Para aquellos de nosotros aquí atraídos por su título, para determinar si un método fue anulado:

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

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

En realidad, no. Esto siempre es cierto, porque una instancia en un método nunca es igual a un método en una clase. –

Cuestiones relacionadas