मॉड्यूल पाठ (3/4)
विशेष विधियाँ (डंडर)
विशेष विधियाँ (जिन्हें डंडर विधियाँ कहा जाता है क्योंकि वे शुरू और ख़त्म होती हैं
डबल अंडरस्कोर के साथ: __name__) वे हुक हैं जो आपकी वस्तुओं को जाने देते हैं
भाषा के साथ एकीकृत करें: पाठ प्रतिनिधित्व, == के साथ तुलना,
len(), in, ऑपरेटरों आदि के लिए समर्थन।
आप पहले ही एक का उपयोग कर चुके हैं: __init__।
__str__ और __repr__
वे print() और REPL में जो दिखाई देता है उसे नियंत्रित करते हैं।
class Punto:
def __init__(self, x, y):
self.x = x
self.y = y
def __repr__(self):
return f"Punto({self.x}, {self.y})"
def __str__(self):
return f"({self.x}, {self.y})"
p = Punto(3, 4)
str(p) # '(3, 4)' — per umani
repr(p) # 'Punto(3, 4)' — per debugger / dev
print(p) # '(3, 4)'
p # Punto(3, 4) in REPL → repr
[p, p] # [Punto(3, 4), Punto(3, 4)] — sempre repr nei contenitoriयदि आप केवल __repr__ को परिभाषित करते हैं, तो पायथन इसे फ़ॉलबैक के रूप में भी उपयोग करता है
__str__.
__eq__: == को पुनः परिभाषित करना
डिफ़ॉल्ट रूप से a == b वस्तुओं के पहचानकर्ताओं की तुलना करता है (is), नहीं
उनकी सामग्री. संरचनात्मक तुलना के लिए, __eq__ को परिभाषित करें:
class Punto:
def __init__(self, x, y):
self.x, self.y = x, y
def __eq__(self, other):
if not isinstance(other, Punto):
return NotImplemented
return (self.x, self.y) == (other.x, other.y)
Punto(1, 2) == Punto(1, 2) # True
Punto(1, 2) == Punto(3, 4) # Falseजब प्रकार लौटाए जाते हैं तो NotImplemented लौटाया जाता है (एक विशेष कीवर्ड, False नहीं!)
तुलनीय नहीं हैं यह सही अभ्यास है: इसके बाद पायथन इसके साथ प्रयास करेगा
अन्य ऑपरेंड के __eq__।
__len__: len() के लिए समर्थन
class Cesto:
def __init__(self):
self.frutti = []
def __len__(self):
return len(self.frutti)
c = Cesto()
c.frutti.append("mela")
len(c) # 1
bool(c) # True (len > 0)__len__ को परिभाषित करके, आपको बूलियन भी निःशुल्क मिलता है: एक ऑब्जेक्ट
len() == 0 के साथ मिथ्या हो जाता है।
अन्य उपयोगी डंडर्स (अवलोकन)
__add__(self, other)→+को पुनः परिभाषित करता है__lt__,__le__,__gt__,__ge__→ तुलना ऑपरेटर__contains__(self, item)→item in selfका समर्थन करता है__iter__+__next__→ वस्तु को पुनरावर्तनीय बनाता है__getitem__(self, key)→self[key]को सपोर्ट करता है__hash__→ एक तानाशाही कुंजी/सेट तत्व होना आवश्यक है
आपकी बारी
`पैसा` को __init__(स्वयं, राशि, मुद्रा) और __str__ के साथ परिभाषित करें जो `f'{राशि} {मुद्रा}'` लौटाता है। `s = Money(42, 'EUR')` बनाएं और `str(s)` का मूल्यांकन करें।
संकेत दिखाएँ
__str__ में एफ-स्ट्रिंग।
3 प्रयासों के बाद समाधान उपलब्ध है
व्यायाम की समीक्षा करें
(ए, बी) की संरचनात्मक तुलना के आधार पर `जोड़ी` को __init__(self, a, b) और __eq__ के साथ परिभाषित करें। `जोड़ी(1, 2) == जोड़ी(1, 2)` का मूल्यांकन करें।
संकेत दिखाएँ
टुपल्स की तुलना करें (स्वयं.ए, स्व.बी) == (अन्य.ए, अन्य.बी)।
3 प्रयासों के बाद समाधान उपलब्ध है
अतिरिक्त चुनौती
\`शीर्षक\` और \`लेखक\` लेने वाले कंस्ट्रक्टर के साथ एक क्लास \`बुक\` को परिभाषित करें। विशेष विधि \`__str__(self)\` को परिभाषित करें ताकि यह स्ट्रिंग \`"लेखक द्वारा शीर्षक"\` लौटाए (उदाहरण के लिए, "जॉर्ज ऑरवेल द्वारा 1984')। किसी पुस्तक को त्वरित करें और \`str(book)\` का मूल्यांकन करें।
संकेत दिखाएँ
def __str__(self): के अंदर f"{self.title} by {self.author}" का उपयोग करें।
3 प्रयासों के बाद समाधान उपलब्ध है