মূল কন্টেন্টে যান
মডিউল 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__ → একটি dict কী / সেট উপাদান হতে হবে

তোমার পালা

ব্যায়াম#python.m7.l3.e1
প্রচেষ্টা: 0লোড হচ্ছে...

__init__(self, amount, currency) এবং __str__ দিয়ে `Money` সংজ্ঞায়িত করুন যা `f'{amount} {মুদ্রা}'` প্রদান করে। `s = Money(42, 'EUR')` তৈরি করুন এবং `str(s)` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

__str__ এ f-স্ট্রিং।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#python.m7.l3.e2
প্রচেষ্টা: 0লোড হচ্ছে...

(a, b) এর কাঠামোগত তুলনার উপর ভিত্তি করে __init__(self, a, b) এবং __eq__ এর সাথে `জোড়া` সংজ্ঞায়িত করুন। `জোড়া(1, 2) == জোড়া(1, 2)` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

টিপল তুলনা করুন (self.a, self.b) == (other.a, other.b)।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

অতিরিক্ত চ্যালেঞ্জ

ব্যায়াম#python.m7.l3.e3
প্রচেষ্টা: 0লোড হচ্ছে...

একজন কন্সট্রাকটর দিয়ে \`শিরোনাম\` এবং \`লেখক\` নিয়ে একটি ক্লাস \`বই\` সংজ্ঞায়িত করুন। বিশেষ পদ্ধতি সংজ্ঞায়িত করুন \`__str__(self)\` যাতে এটি স্ট্রিংটি ফেরত দেয় \`"লেখকের শিরোনাম"\` (যেমন \`'1984 দ্বারা জর্জ অরওয়েল'\`)। একটি বই তাত্ক্ষণিক করুন এবং \`str(বই)\` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

def __str__(self): এর ভিতরে f"{self.title} by {self.author}" ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ