🔹 اکثر پایتونکارها برای مانیتور کردن، ثبت (Registration) یا ولیدیشن کلاسهای فرزندی که از یک کلاس به ارث میرسن، سراغ Metaclass میرن. اما متانویسی کد رو پیچیده، سنگین و خواناییش رو سخت میکنه.
🔹 از پایتون ۳.۶ به بعد، یک «تاس جادویی» به اسم init_subclass اضافه شد که ۹۰٪ نیازهای شما به متانویسی رو بدون هیچ پیچیدگی برطرف میکنه!
🔹 کاربرد واقعیش کجاست؟ (ساخت یک Plugin System خودکار)
🔹 فرض کنید میخواید هر وقت کلاسی از کلاس پایه شما ارثبری کرد، اسمش تلقائی توی یک دیکشنری ثبت بشه:
class BasePlugin:
plugins = {}
def __init_subclass__(cls, plugin_name: str = None, **kwargs):
super().__init_subclass__(**kwargs)
# اگر نام پلاگین مشخص نشده بود، از اسم خود کلاس استفاده کن
name = plugin_name or cls.__name__
cls.plugins[name] = cls
# حالا هر پلاگینی تعریف بشه، اتوماتیک ثبت میشه:
class AudioPlugin(BasePlugin, plugin_name="audio_player"):
pass
class VideoPlugin(BasePlugin, plugin_name="video_player"):
pass
print(BasePlugin.plugins)
# خروجی:
# {'audio_player': <class '__main__.AudioPlugin'>, 'video_player': <class '__main__.VideoPlugin'>}
🔹به چه دردی میخوره؟
بدون ساخت Metaclass پیچیده، رفتارهای ارثبری رو مدیریت میکنید.
میتونید ورودیهای سفارشی (مثل plugin_name) مستقیماً موقع ارثبری کلاس بهش بدید.
کد کاملاً تمیز، خوانا و مطابق استاندارد روز پایتونه.
🐍 @python_rd