मैं इसे पायथन 3.4 और 3.7 दोनों पर पुन: पेश करने में कामयाब रहा।
विचार करना:
class Comparable:
def _key(self):
raise NotImplementedError
def __hash__(self):
return hash(self._key())
def __eq__(self, other):
...
def __lt__(self, other):
...
class A(Comparable): pass
class B(A):
def __str__(self):
return "d"
def __eq__(self, other):
return isinstance(self, type(other))
def _key(self):
return str(self),
b = B()
स्पष्ट रूप से कोई उम्मीद करेगा कि b.__hash__
को यहां परिभाषित किया जाएगा, क्योंकि इसे Comparable
के तहत परिभाषित किया गया है, जो B
का एक उपवर्ग है।
देखो और देखो, यह परिभाषित है, लेकिन None
का मूल्यांकन करता है। क्या दिया?
>> b
<__main__.B object at 0x00000183C9734978>
>> '__hash__' in dir(b)
True
>> b.__hash__
>> b.__hash__ is None
True
>> B.__mro__
(<class '__main__.B'>, <class '__main__.A'>, <class '__main__.Comparable'>, <class 'object'>)
>> isinstance(b, Comparable)
True
__init__
को Comparable
और A
में super().__init__()
के रूप में लागू करने पर वही व्यवहार पुन: उत्पन्न होता है।
1 उत्तर
इसे दस्तावेज़ में मिला:
एक वर्ग जो
__eq__()
को ओवरराइड करता है और__hash__()
को परिभाषित नहीं करता है, उसका__hash__()
परोक्ष रूप से कोई नहीं पर सेट होगा।
तथा
यदि कोई वर्ग जो
__eq__()
को ओवरराइड करता है, उसे मूल वर्ग से__hash__()
के कार्यान्वयन को बनाए रखने की आवश्यकता है, तो दुभाषिया को__hash__ = <ParentClass>.__hash__
सेट करके यह स्पष्ट रूप से बताया जाना चाहिए।
टिकट से 1549:
यह जानबूझकर किया गया था - यदि आप हैश को परिभाषित किए बिना तुलना को परिभाषित करते हैं, तो डिफ़ॉल्ट हैश आपकी तुलना से मेल नहीं खाएगा, और शब्दकोश कुंजी के रूप में उपयोग किए जाने पर आपकी वस्तुएं गलत व्यवहार करेंगी।
(गुइडो वैन रोसुम)
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।