مرکزی مواد پر جائیں
ماڈیول 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

جب اقسام ہیں موازنہ درست عمل نہیں ہے: ازگر پھر اس کے ساتھ کوشش کرے گا۔ دوسرے آپرینڈ کا __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__(self, amount, currency) اور __str__ کے ساتھ `Money` کی وضاحت کریں جو `f'{amount} {currency}'` لوٹاتا ہے۔ `s = Money(42, 'EUR')` بنائیں اور `str(s)` کا اندازہ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

__str__ میں f-string۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#python.m7.l3.e2
کوششیں: 0لوڈ ہو رہا ہے…

(a، b) کے ساختی موازنہ کی بنیاد پر __init__(self, a, b) اور __eq__ کے ساتھ `Pair` کی وضاحت کریں۔ `Pair(1, 2) == جوڑا(1, 2)` کا اندازہ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

ٹیپلز کا موازنہ کریں (self.a, self.b) == (other.a, other.b)۔

3 کوششوں کے بعد حل دستیاب ہے۔

اضافی چیلنج

ورزش#python.m7.l3.e3
کوششیں: 0لوڈ ہو رہا ہے…

ایک کلاس کی وضاحت کریں \`Book\` جس میں کنسٹرکٹر \`title\` اور \`author\` لے رہا ہو۔ مخصوص طریقہ کی وضاحت کریں \`__str__(self)\` تو یہ سٹرنگ واپس کرتا ہے \`"Title by Author"\` (جیسے \`'1984 by George Orwell'\`)۔ ایک کتاب کو فوری بنائیں اور \`str(کتاب)\` کا جائزہ لیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

def __str__(self): کے اندر f"{self.title} by {self.author}" استعمال کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔