2010-02-23 13 views
13

Ran in die folgenden:a == b ist falsch, aber id (a) == id (b) ist wahr?

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

Was hier los?

Antwort

8

Die folgenden Werke:

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

Hinweis: Diese Antwort kann nur für Python 2. – BenC

11

Als String id(A.__str__) == id(B.__str__) ausgewertet wird, A.__str__ erstellt wird, seine ID genommen, und dann Müll gesammelt. Dann wird B.__str__ erstellt, und passiert zufällig an der gleichen Adresse, die A.__str__ war früher, so dass es (in CPython) die gleiche ID.

Versuchen A.__str__ und B.__str__ zu temporären Variablen zuweisen, und Sie werden etwas anderes sehen:

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

Für ein einfacheres Beispiel für dieses Phänomen, versuchen:

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

Aber warum >>> f = A .__ str__ >>> id (f) == id (A .__ str__) Falsch – Krab

+0

'A. __str__' ist erstellt ??? Ich bin mir nicht sicher: Es muss Teil der Metaklasse sein, die alle Klassen hervorbringt, also ihre grundlegende "DNA". – jldupont

+2

@jldupont: Python erstellt zur Laufzeit die ungebundenen Methoden 'A .__ str__' und' B .__ str__'. http://users.rcn.com/python/download/Descriptor.htm ist eine gute Referenz für die zugrundeliegenden Mechanismen. –

0

Für diejenigen von uns hier angezogen durch Ihren Titel, um festzustellen, ob eine Methode außer Kraft gesetzt wurde:

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

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

Eigentlich nein. Dies ist immer der Fall, da eine Instanz einer Methode niemals einer Methode in einer Klasse entspricht. –

Verwandte Themen