2012-06-26 16 views
8

मैं पाइथन (3.2) में एक प्रोजेक्ट कर रहा हूं जिसके लिए मुझे उपयोगकर्ता परिभाषित वस्तुओं की तुलना करने की आवश्यकता है।जावा की तुलना के पाइथन समकक्ष()

public class Foo { 
    int a, b; 

    public Foo(int aa, int bb) { 
     a = aa; 
     b = bb; 
    } 

    public int compareTo(Foo that) { 
     // return a negative number if this < that 
     // return 0 if this == that 
     // return a positive number if this > that 

     if (this.a == that.a) return this.b - that.b; 
     else return this.a - that.a; 
    } 
} 

मैं काफी वर्गों/वस्तुओं के लिए नए कर रहा हूँ: मैं जावा, में OOP करने के लिए जहां एक, वर्ग कि उस वर्ग के प्राकृतिक आदेश निर्दिष्ट करता है में एक compareTo() विधि को परिभाषित करेगा कि नीचे उदाहरण में के रूप में इस्तेमाल कर रहा हूँ पायथन में, इसलिए मैं जानना चाहता हूं कि कक्षा के प्राकृतिक क्रम को परिभाषित करने के लिए "पायथनिक" तरीका क्या है?

+1

आप [ '__cmp__'] की तरह मतलब (http : //docs.python.org/reference/datamodel.html#object.__cmp__)? –

उत्तर

10

कस्टम प्रकारों के लिए डिफ़ॉल्ट ऑपरेटरों को लागू करने के लिए आप विशेष विधियों __lt__, __gt__ आदि लागू कर सकते हैं। language reference में उनके बारे में और देखें।

उदाहरण के लिए:

class Foo: 
    def __init__ (self, a, b): 
     self.a = a 
     self.b = b 

    def __lt__ (self, other): 
     if self.a == other.a: 
      return self.b < other.b 
     return self.a < other.b 

    def __gt__ (self, other): 
     return other.__lt__(self) 

    def __eq__ (self, other): 
     return self.a == other.b and self.b == other.b 

    def __ne__ (self, other): 
     return not self.__eq__(other) 

या के रूप में टिप्पणी में Stranac से कहा, तुम कुछ लेखन बच total_ordering डेकोरेटर का उपयोग कर सकते हैं:

@functools.total_ordering 
class Foo: 
    def __init__ (self, a, b): 
     self.a = a 
     self.b = b 

    def __lt__ (self, other): 
     if self.a == other.a: 
      return self.b < other.b 
     return self.a < other.b 

    def __eq__ (self, other): 
     return self.a == other.b and self.b == other.b 
+3

आप '__lt__' और' __eq__' को भी परिभाषित कर सकते हैं और 'functools.total_ordering' सजावट का उपयोग कर सकते हैं। – stranac

+1

पाइथन 2 '__gt__' में स्वचालित रूप से '__lt__' नहीं है अगर प्रदान नहीं किया गया है (बस इसका परीक्षण किया गया है)। अजीब बात है कि दस्तावेज अन्यथा कहता है। कोई इसे पायथन 3, शायद @stranac पर परीक्षण करना चाहता है? – schlamar

+0

आप सही हैं, लेकिन यह संभव हो सकता है कि दस्तावेज़ीकरण वास्तव में केवल विपरीत को संदर्भित करता है, यानी 'नहीं (< b) == (a > = बी)' (जहां बाद में परिभाषित नहीं किया गया अपवाद उठाएगा), तो मुझे लगता है कि यह स्वैप करता है यदि संभव हो तो पैरामीटर। – poke

6

पायथन का एक समान कार्य है: __cmp__()

मैं अब आप देख पायथन 3. Their "whats new" suggests बारे में पूछ रहे:

 
The cmp() function should be treated as gone, and the __cmp__() special method 
is no longer supported. Use __lt__() for sorting, __eq__() with __hash__(), and 
other rich comparisons as needed. (If you really need the cmp() functionality, 
you could use the expression (a > b) - (a < b) as the equivalent for cmp(a, b).) 

तो ऐसा लगता है कि आप हमेशा लागू करने के बाद

def compareTo(self, that): 
    return ((self > that) - (self < that)) 

या

@classmethod 
def compare(cls, a, b): 
    return ((a > b) - (a < b)) 

की तरह कुछ कर सकता है __gt__() और __lt__()

जो तुम तो जैसे प्रयोग करेंगे:

f1 = Foo(1,1) 
f2 = Foo(2,2) 

f1.compareTo(f2) 
Foo.compare(f1,f2) 

यह आपको बराबर कार्यक्षमता देना होगा।

+3

'__cmp__' अब पायथन 3 में मौजूद नहीं है, और ओपी पाइथन 3 के बारे में पूछ रहा है। – poke

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