DEV Community

Vafa
Vafa

Posted on

معرفی متاکلاس‌ها در پایتون

متاکلاس‌ها از اون چیزهایی هستن که اسمشون ترسناک به‌نظر میاد، ولی واقعاً ساده تر از چیزی هستن که فکر میکنیم

کلاس‌ها شیء می‌سازن

متاکلاس‌ها خودشون کلاس می‌سازن

مثلاً وقتی می‌نویسی:

class User:
    pass

Enter fullscreen mode Exit fullscreen mode

این کلاس User خودش یه شیء حساب می‌شه. پایتون هم برای ساختنش از یه چیزی به اسم متاکلاس استفاده می‌کنه.
به‌طور پیش‌فرض هم از type استفاده می‌کنه:

print(type(User))

Enter fullscreen mode Exit fullscreen mode

که نتیجه‌ش:

<class 'type'>

Enter fullscreen mode Exit fullscreen mode

پس type در واقع سازندهٔ کلاس‌هاست.

اصلاً چرا باید از متاکلاس استفاده کنیم؟

واقعیت اینه که، ۹۹٪ برنامه‌نویس‌ها هیچ‌وقت از متاکلاس استفاده نمی‌کنن — و مشکلی هم نیست.

ولی فریم‌ورک‌های معروف مثل Django و SQLAlchemy و Pydantic ازش استفاده می‌کنن برای:

اضافه‌کردن یه سری ویژگی اضافه به کلاس‌ها

تغییر دادن یا چک کردن کلاس‌ها موقع ساخته شدن

ثبت خودکار زیرکلاس‌ها

کمتر کردن کدهای تکراری

متاکلاس بهت اجازه می‌ده قبل از اینکه کلاس ساخته بشه توی روند ساختنش دخالت کنی.

یک مثال خیلی ساده

این متاکلاس اسم هر کلاسی رو که ساخته می‌شه چاپ می‌کنه:

class LoggerMeta(type):
    def __new__(cls, name, bases, attrs):
        print("Creating:", name)
        return super().__new__(cls, name, bases, attrs)

Enter fullscreen mode Exit fullscreen mode

استفاده:

class Example(metaclass=LoggerMeta):
    pass
Enter fullscreen mode Exit fullscreen mode

وقتی فایل اجرا می‌شه، اینو چاپ می‌کنه:

Creating: Example

چون متاکلاس قبل از خود کلاس اجرا می‌شه.

اضافه کردن ویژگی به صورت خودکار

یه نمونه کاربردی‌تر:

class InfoMeta(type):
    def __new__(cls, name, bases, attrs):
        attrs["source"] = "auto"
        return super().__new__(cls, name, bases, attrs)

Enter fullscreen mode Exit fullscreen mode

استفاده:

class Product(metaclass=InfoMeta):
    pass

print(Product.source)

Enter fullscreen mode Exit fullscreen mode

خروجی:

auto

کی باید سراغ متاکلاس بریم؟

اگه داری یه برنامه معمولی می‌نویسی، تقریباً هیچ‌وقت!

متاکلاس‌ها بیشتر برای وقتی‌ان که می‌خوای نحوه ساخته شدن کلاس‌ها رو کنترل کنی — معمولاً توی ساخت فریم‌ورک‌ها، کتابخونه‌ها یا ابزارهای سطح بالا.

Top comments (0)