TGViewer
PyCoders (پایتون) PyCoders (پایتون) @python_rd · 4.1K subscribers
Post #2229 368
🔆 جادوی init_subclass: جایگزین مدرن و تمیز برای Metaclassها

🔹 اکثر پایتون‌کارها برای مانیتور کردن، ثبت (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
  • 👍 1
More from @python_rd
  1. Oct 13, 2026کوییز پایتون 🔆 خروجی اجرای کد زیر چیست؟ t = (1, 2, [3, 4]) try: t[2] += [5] except TypeEr…
  2. Oct 13, 2026🔆 راز مکانیزم پیاده‌سازی و تغییر جهت NaN در الگوریتم مرتب‌سازی پایتون (Timsort) 🔹 باگ ری…
  3. Oct 13, 2026🔆 حذف تاریخی GIL از پایتون (Free-threaded Python) 🔹 یک رویداد تاریخی: حذف قفل مفسر (GIL)…
  4. Oct 11, 2026🔆 مدیریت تمیز منابع با Context Managerهای سفارشی (contextlib) 🔹 ساخت Context Managerها م…
  5. Oct 10, 2026🔆 چرا برای داده‌های حجیم نباید از return استفاده کنی؟ 🔹 وقتی یک تابع لیست بزرگی از داده‌…
  6. Oct 10, 2026🔆 خروجی این تکه کد چیه؟ def add_item(item, lst=[]): lst.append(item) return lst print(add…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →