متدهای جادویی (Magic Methods) در پایتون چیستند؟

1

متدهای جادویی (Magic Methods) در پایتون چیستند؟

در دنیای برنامه‌نویسی شی‌گرا با پایتون، گاهی به متدهایی برمی‌خوریم که در ابتدا و انتهای نام خود دارای دو خط تیره پایین (Underscore) هستند. این متدها که به آن‌ها «متدهای جادویی» (Magic Methods) گفته می‌شود، یکی از جذاب‌ترین و قدرتمندترین ویژگی‌های پایتون به شمار می‌روند. در این مقاله از سایت پای شو، قصد داریم بررسی کنیم که این متدها دقیقاً چه هستند، چرا به این نام شناخته می‌شوند و چگونه می‌توانیم با استفاده از آن‌ها، رفتارهای سفارشی و حرفه‌ای به کلاس‌های خود اضافه کنیم.

متدهای جادویی یا Dunder Methods چیستند؟

متدهای جادویی، توابع از پیش تعریف شده‌ای در پایتون هستند که ما معمولاً آن‌ها را به صورت مستقیم فراخوانی نمی‌کنیم. در عوض، خود مفسر پایتون در شرایط خاص و در پس‌زمینه، آن‌ها را اجرا می‌کند.

به دلیل وجود دو خط تیره پایین در ابتدا و انتهای نام این متدها (مانند __init__)، در جامعه برنامه‌نویسان پایتون به آن‌ها Dunder Methods (مخفف Double Underscore) نیز می‌گویند.

چرا به این متدها «جادویی» می‌گویند؟

دلیل این نام‌گذاری این است که متدهای جادویی در پشت صحنه عمل می‌کنند و به اشیاء ساخته شده توسط شما قابلیت‌هایی می‌بخشند که باعث می‌شود دقیقاً مانند انواع داده‌های پیش‌فرض پایتون (مثل لیست‌ها، رشته‌ها و اعداد) رفتار کنند.

برای مثال، وقتی شما از تابع len() برای پیدا کردن طول یک لیست استفاده می‌کنید یا دو عدد را با علامت + جمع می‌بندید، پایتون در پس‌زمینه در حال فراخوانی متدهای جادویی مربوط به آن‌هاست. شما می‌توانید با پیاده‌سازی این متدها در کلاس‌های خود، این قابلیت‌ها را برای اشیاء سفارشی خودتان نیز تعریف کنید.

پرکاربردترین متدهای جادویی در پایتون

برای درک بهتر، در ادامه چند مورد از مهم‌ترین متدهای جادویی را با ذکر مثال بررسی می‌کنیم:

۱. متد مقداردهی اولیه (__init__)

احتمالاً تا به حال با این متد آشنا شده‌اید. متد __init__ به عنوان سازنده (Constructor) کلاس شناخته می‌شود و بلافاصله پس از ایجاد یک شیء جدید از کلاس، برای مقداردهی اولیه به صفات (Attributes) فراخوانی می‌شود.

Python

class Book:
    def __init__(self, title, pages):
        self.title = title
        self.pages = pages

my_book = Book("آموزش پایتون", 350)

۲. نمایش رشته‌ای خوانا (__str__)

اگر یک شیء از کلاس بالا را print کنید، پایتون به صورت پیش‌فرض آدرس آن شیء در حافظه را چاپ می‌کند که برای کاربر نهایی اصلاً خوانا نیست. با استفاده از متد __str__، می‌توانید تعیین کنید که هنگام چاپ شیء، چه متنی نمایش داده شود.

Python

class Book:
    def __init__(self, title, pages):
        self.title = title
        self.pages = pages

    def __str__(self):
        return f"کتاب '{self.title}' دارای {self.pages} صفحه است."

my_book = Book("آموزش پایتون", 350)
print(my_book) 
# خروجی: کتاب 'آموزش پایتون' دارای 350 صفحه است.

۳. تعریف طول سفارشی (__len__)

تابع توکار len() در پایتون برای به دست آوردن طول یک متغیر استفاده می‌شود. با تعریف متد جادویی __len__ در کلاس خود، می‌توانید به پایتون بگویید که وقتی این تابع روی شیء شما صدا زده شد، دقیقاً چه چیزی را به عنوان “طول” برگرداند (مثلاً تعداد صفحات یک کتاب).

Python

class Book:
    def __init__(self, title, pages):
        self.title = title
        self.pages = pages

    def __len__(self):
        return self.pages

my_book = Book("آموزش پایتون", 350)
print(len(my_book)) 
# خروجی: 350

۴. سربارگذاری عملگرها (__add__)

یکی از جذاب‌ترین کاربردهای متدهای جادویی، Operator Overloading یا سربارگذاری عملگرها است. فرض کنید می‌خواهید با علامت +، دو شیء مختلف را با هم جمع کنید. با استفاده از متد __add__ می‌توانید رفتار این عملگر را شخصی‌سازی کنید.

Python

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    # تعریف رفتار عملگر جمع (+)
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __str__(self):
        return f"بردار ({self.x}, {self.y})"

v1 = Vector(2, 4)
v2 = Vector(3, 1)

v3 = v1 + v2
print(v3) 
# خروجی: بردار (5, 5)

همان‌طور که می‌بینید، توانستیم دو شیء کاملاً سفارشی را به سادگی و با استفاده از عملگر + با یکدیگر جمع کنیم.

جمع‌بندی

متدهای جادویی (Magic Methods) به شما این قدرت را می‌دهند که کلاس‌های خود را با اکوسیستم پایتون یکپارچه کنید. با استفاده از این متدها، اشیاء شما می‌توانند از عملگرهای استاندارد ریاضی پشتیبانی کنند، با توابع توکار پایتون (مثل len و print) سازگار شوند و کدهایی بسیار خواناتر و تمیزتر خلق کنند.

برای یادگیری عمیق‌تر مباحث پیشرفته شی‌گرایی، سایر مقالات آموزشی ما را در پای شو دنبال کنید.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *