मुख्य सामग्री पर जाएं
मॉड्यूल 7 · पाठ 3 का 4पाठ्यक्रम में 27/36~12 min
मॉड्यूल पाठ (3/4)

विशेष विधियाँ (डंडर)

विशेष विधियाँ (जिन्हें डंडर विधियाँ कहा जाता है क्योंकि वे शुरू और ख़त्म होती हैं डबल अंडरस्कोर के साथ: __name__) वे हुक हैं जो आपकी वस्तुओं को जाने देते हैं भाषा के साथ एकीकृत करें: पाठ प्रतिनिधित्व, == के साथ तुलना, len(), in, ऑपरेटरों आदि के लिए समर्थन।

आप पहले ही एक का उपयोग कर चुके हैं: __init__।

__str__ और __repr__

वे print() और REPL में जो दिखाई देता है उसे नियंत्रित करते हैं।

Python
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__ को परिभाषित करें:

Python
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() के लिए समर्थन

Python
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__ → एक तानाशाही कुंजी/सेट तत्व होना आवश्यक है

आपकी बारी

व्यायाम#python.m7.l3.e1
प्रयास: 0लोड हो रहा है...

`पैसा` को __init__(स्वयं, राशि, मुद्रा) और __str__ के साथ परिभाषित करें जो `f'{राशि} {मुद्रा}'` लौटाता है। `s = Money(42, 'EUR')` बनाएं और `str(s)` का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

__str__ में एफ-स्ट्रिंग।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#python.m7.l3.e2
प्रयास: 0लोड हो रहा है...

(ए, बी) की संरचनात्मक तुलना के आधार पर `जोड़ी` को __init__(self, a, b) और __eq__ के साथ परिभाषित करें। `जोड़ी(1, 2) == जोड़ी(1, 2)` का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

टुपल्स की तुलना करें (स्वयं.ए, स्व.बी) == (अन्य.ए, अन्य.बी)।

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#python.m7.l3.e3
प्रयास: 0लोड हो रहा है...

\`शीर्षक\` और \`लेखक\` लेने वाले कंस्ट्रक्टर के साथ एक क्लास \`बुक\` को परिभाषित करें। विशेष विधि \`__str__(self)\` को परिभाषित करें ताकि यह स्ट्रिंग \`"लेखक द्वारा शीर्षक"\` लौटाए (उदाहरण के लिए, "जॉर्ज ऑरवेल द्वारा 1984')। किसी पुस्तक को त्वरित करें और \`str(book)\` का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

def __str__(self): के अंदर f"{self.title} by {self.author}" का उपयोग करें।

3 प्रयासों के बाद समाधान उपलब्ध है