2010-02-23 17 views
13

निम्न में दौड़ें:एक == बी झूठा है, लेकिन आईडी (ए) == आईडी (बी) सच है?

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

यहां क्या हो रहा है?

उत्तर

8

निम्नलिखित काम करता है:

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

नोट: इस सवाल का जवाब केवल पायथन 2. – BenC

11

स्ट्रिंग id(A.__str__) == id(B.__str__) के रूप में मूल्यांकन किया जाता है, A.__str__ बनाई गई है, इसकी पहचान लिया, और फिर कचरा एकत्र। फिर B.__str__ बनाया गया है, और उसी पते पर समाप्त होता है जो A.__str__ पहले था, इसलिए यह उसी आईडी में (सीपीथॉन में) हो जाता है।

बताए A.__str__ और B.__str__ अस्थायी चर करने की कोशिश करो और आप कुछ अलग दिखाई देंगे:

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

इस घटना का एक सरल उदाहरण के लिए, कोशिश:

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

लिए काम करता है लेकिन फिर, क्यों >>> च = एक .__ str__ >>> आईडी (च) == आईडी (ए .__ str__) झूठी – Krab

+0

'ए __str__' बनाया गया है ??? इसके बारे में निश्चित नहीं है: यह मेटाक्लास का हिस्सा होना चाहिए जो सभी वर्गों को उनके मूल "डीएनए" बनाता है। – jldupont

+2

@jldupont: पायथन रनटाइम पर 'ए .__ str__' और 'B .__ str__' अनबाउंड विधियों को बनाता है। http://users.rcn.com/python/download/Descriptor.htm अंतर्निहित तंत्र के लिए एक अच्छा संदर्भ है। –

0

हम में से उन लोगों के यहां आकर्षित करने के लिए आपके शीर्षक से, यह निर्धारित करने के लिए कि कोई विधि ओवरराइड की गई थी:

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

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

असल में, नहीं। यह हमेशा सत्य है, क्योंकि किसी विधि पर एक उदाहरण कक्षा पर किसी विधि के बराबर नहीं होता है। –

संबंधित मुद्दे