2010-01-27 14 views
5
class x: 
    def __init__(self,name): 
     self.name=name 

    def __str__(self): 
     return self.name 

    def __cmp__(self,other): 
     print("cmp method called with self="+str(self)+",other="+str(other)) 
     return self.name==other.name 
     # return False 


instance1=x("hello") 
instance2=x("there") 

print(instance1==instance2) 
print(instance1.name==instance2.name) 

उत्पादन यहाँ है:__cmp__ विधि यह Python 2.x में अपेक्षित के रूप में काम नहीं कर रहा है?

cmp method called with self=hello,other=there 
True 
False 

कौन सा नहीं है कि मैं क्या उम्मीद: मैं कहना है 'दो उदाहरणों बराबर है, तो नाम फ़ील्ड बराबर कर रहे हैं' कोशिश कर रहा हूँ।

यदि __cmp__ फ़ंक्शन से मैं बस return False करता हूं, तो यह True के रूप में भी रिपोर्ट करता है !! यदि मैं -1 लौटाता हूं, तो मुझे False मिलता है - लेकिन चूंकि मैं तारों की तुलना करने की कोशिश कर रहा हूं, यह सही नहीं लगता है।

मैं यहाँ क्या गलत कर रहा हूं?

उत्तर

9

__cmp__(x,y) एक ऋणात्मक संख्या (जैसे -1) यदि x < y, एक सकारात्मक संख्या लौटना चाहिए के लिए अपने कोड में

return cmp(self.name, other.name) 

कर सकते हैं (उदाहरण के लिए 1) यदि x > y और 0 अगर x == y। आपको इसके साथ एक बूलियन कभी नहीं लौटना चाहिए।

आप ओवरलोडिंग क्या कर रहे हैं __eq__(x, y) है।

+0

धन्यवाद - आपको टिकटें मिलती है (भले ही अन्य लोगों ने समान जानकारी प्रदान की हो), क्योंकि यह सबसे स्पष्ट स्पष्टीकरण है! – monojohnny

+0

जैसा कि अन्य ने टिप्पणी की, __cmp __() अप्रचलित है। इसके बजाय __lt __(), __eq __(), और __gt __() को परिभाषित करें। Http://docs.python.org/dev/whatsnew/3.0.html#ordering-comparisons के अनुसार – smci

2

__cmp__() अश्लील है। __lt__(), __eq__(), और __gt__() को इसके बजाय परिभाषित करें।

फिर भी, आप इसे गलत कर रहे हैं। आपको एक पूर्णांक वापस करना होगा।

+0

"obsolescent" ?? आपने इसे कहाँ से चुना? अन्य मौजूद हैं, लेकिन ज्यादातर मामलों में यह __cmp__ का उपयोग करने के लिए अधिक समझ में आता है, इस मामले में, उदाहरण के लिए, इसमें केवल एक के बजाय 3 विधियां होंगी। http://docs.python.org/reference/datamodel.html – jsbueno

+1

@jsbueno: तीसरा बुलेट बिंदु: http://docs.python.org/dev/3.0/whatsnew/3.0.html#ordering-comparisons –

+0

URL स्थानांतरित हो गया है http://docs.python.org/dev/whatsnew/3.0.html#ordering-comparisons – smci

5

__cmp__ विधि -1, 0 या 1 वापस आनी चाहिए, जब स्वयं < अन्य, स्वयं == अन्य, स्वयं> अन्य सम्मान से।

आप एक उचित परिणाम

+0

धन्यवाद! बाहर निकलता है मेरा मतलब '__eq__' था! – monojohnny

0

लुक __cmp__ के लिए दस्तावेज़, आप एक पूर्णांक वापस जाने के लिए चाहिए:

एक नकारात्मक पूर्णांक लौट चाहिए अगर स्वयं < अन्य, शून्य स्वयं यदि == अन्य, एक सकारात्मक पूर्णांक यदि स्वयं> अन्य।

4

आप __cmp____eq__ के साथ भ्रमित कर रहे हैं।

From the documentation of __cmp__:

एक नकारात्मक पूर्णांक लौट चाहिए अगर आत्म < अन्य, शून्य स्वयं यदि == अन्य, एक सकारात्मक पूर्णांक है, तो स्वयं> अन्य।

__eq__ एक बूलियन जो निर्धारित करता है कि दो वस्तुओं के बराबर हैं, __cmp__ एक पूर्णांक जो निर्धारित करता है कि दो वस्तुओं अधिक से अधिक या एक दूसरे को कम से कम कर रहे हैं देता है, और जब तक आप विशिष्ट है तो कहा जाता है देता है __eq__, __ne__, __le__, __ge__, __lt__ और __gt__ विधियां।

अपने मामले में आप __cmp__ विधि __eq__ के बजाय विधि चाहते हैं क्योंकि यह आपको अन्य तुलनाओं के लिए अन्य 5 विधियों को लागू करने से बचाएगा।

आप cmp() function इस्तेमाल कर सकते हैं और डाल अपने __cmp__ विधि में निम्नलिखित:

return cmp(self.name,other.name) 

ध्यान दें, as highlighted by Ignacio इस isn't the preferred method in Python 3.0 है, लेकिन अजगर 2.x __cmp__ में जाने का रास्ता है।

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