متاکلاسها از اون چیزهایی هستن که اسمشون ترسناک بهنظر میاد، ولی واقعاً ساده تر از چیزی هستن که فکر میکنیم
کلاسها شیء میسازن
متاکلاسها خودشون کلاس میسازن
مثلاً وقتی مینویسی:
class User:
pass
این کلاس User خودش یه شیء حساب میشه. پایتون هم برای ساختنش از یه چیزی به اسم متاکلاس استفاده میکنه.
بهطور پیشفرض هم از type استفاده میکنه:
print(type(User))
که نتیجهش:
<class 'type'>
پس type در واقع سازندهٔ کلاسهاست.
اصلاً چرا باید از متاکلاس استفاده کنیم؟
واقعیت اینه که، ۹۹٪ برنامهنویسها هیچوقت از متاکلاس استفاده نمیکنن — و مشکلی هم نیست.
ولی فریمورکهای معروف مثل Django و SQLAlchemy و Pydantic ازش استفاده میکنن برای:
اضافهکردن یه سری ویژگی اضافه به کلاسها
تغییر دادن یا چک کردن کلاسها موقع ساخته شدن
ثبت خودکار زیرکلاسها
کمتر کردن کدهای تکراری
متاکلاس بهت اجازه میده قبل از اینکه کلاس ساخته بشه توی روند ساختنش دخالت کنی.
یک مثال خیلی ساده
این متاکلاس اسم هر کلاسی رو که ساخته میشه چاپ میکنه:
class LoggerMeta(type):
def __new__(cls, name, bases, attrs):
print("Creating:", name)
return super().__new__(cls, name, bases, attrs)
استفاده:
class Example(metaclass=LoggerMeta):
pass
وقتی فایل اجرا میشه، اینو چاپ میکنه:
Creating: Example
چون متاکلاس قبل از خود کلاس اجرا میشه.
اضافه کردن ویژگی به صورت خودکار
یه نمونه کاربردیتر:
class InfoMeta(type):
def __new__(cls, name, bases, attrs):
attrs["source"] = "auto"
return super().__new__(cls, name, bases, attrs)
استفاده:
class Product(metaclass=InfoMeta):
pass
print(Product.source)
خروجی:
auto
کی باید سراغ متاکلاس بریم؟
اگه داری یه برنامه معمولی مینویسی، تقریباً هیچوقت!
متاکلاسها بیشتر برای وقتیان که میخوای نحوه ساخته شدن کلاسها رو کنترل کنی — معمولاً توی ساخت فریمورکها، کتابخونهها یا ابزارهای سطح بالا.
Top comments (0)