Person.name
पर प्रकाश मत जाओ कुछ का एक उदाहरण है एक कस्टम __eq__
विधि के साथ टाइप करें। जबकि __eq__
आमतौर पर एक बूलियन (आईएसएच) मान देता है, यह वास्तव में जो भी आप चाहते हैं उसे लौटा सकता है, जिसमें लैम्ब्डा भी शामिल है। इस और संबंधित विधियों पर अधिक के लिए Python special method names देखें।
शायद सबसे भ्रामक/इस बात का भ्रामक हिस्सा (खासकर यदि आप जावा जैसे अन्य OO भाषाओं के लिए इस्तेमाल कर रहे हैं) Person.name
और person.name
(जहां person
Person
का एक उदाहरण है) के लिए किसी भी संबंध नहीं है की जरूरत नहीं है कि है एक दूसरे। उदाहरण के लिए:
class Person(object):
name = "name of class"
def __init__(self):
self.name = "name of instance"
person = Person()
print Person.name
print person.name
यह प्रिंट होगा:
name of class
name of instance
ध्यान दें कि वर्ग संपत्ति सिर्फ जबकि उदाहरण संपत्ति __init__
विधि में सेट है, वर्ग शरीर में सेट है।
class LambdaThingy(object):
def __init__(self, attrname):
self.__attrname = attrname
def __eq__(self, other):
return lambda x: getattr(x, self.__attrname) == other
class Person(object):
name = LambdaThingy('name')
def __init__(self, name):
self.name = name
equals_fred = Person.name == "Fred"
equals_barney = Person.name == "Barney"
fred = Person("Fred")
print equals_fred(fred)
print equals_barney(fred)
यह प्रिंट:
True
False
यह निश्चित रूप है
आपके मामले में, आप कस्टम __eq__
विधि है कि एक लैम्ब्डा देता है, कुछ इस तरह के साथ वस्तु को Person.name
सेट करेंगे "बहुत चालाक" होने के किनारे पर स्कर्टिंग, इसलिए मैं उत्पादन कोड में इसका उपयोग करने के बारे में बहुत सावधान रहूंगा। भविष्य में रखरखाव करने वालों के लिए शायद एक स्पष्ट लैम्ब्डा बहुत स्पष्ट होगा, भले ही यह थोड़ा और वर्बोज़ हो।
स्रोत
2009-05-04 21:19:20
जावा और ऑपरेटर ओवरलोडिंग ... ऐसा नहीं लगता कि यह कभी भी सच होगा। दूसरी ओर, शायद आप सही हैं। – Geo
विषम .... एक "अनुमान" उत्तर स्वीकार करते समय एक और उत्तर तूफान में वास्तविक स्रोत कोड पर आधारित होता है। –
क्षमा करें, लेकिन मेरा अनुमान "पर्याप्त तेज़" था :-) पीएस आप सही हैं, यह बहुत अजीब है! – dfa