TGViewer
PyCoders (پایتون) PyCoders (پایتون) @python_rd · 4.11K subscribers
Post #2167 489
🔆 مفهوم قدرتمند و پنهان init_subclass در پایتون (معرفی‌شده از پایتون ۳.۶)؛ ابزاری شیک و تمیز که جایگزین کدنویسی پیچیده با Metaclassها میشه و بهت اجازه میده رفتار کلاس‌های فرزند (Subclasses) رو کنترل و مدیریت کنی.


🔹 چطور موقع ارث‌بری، کلاس فرزند رو خودکار اعتبارسنجی یا ثبت کنیم؟
فرض کن داری یک فریم‌ورک، Plugin System یا ساختار Modular می‌نویسی و می‌خوای هر وقت کلاسی از کلاس پایه تو ارث‌بری کرد، یک سری قوانین اجرا بشن (مثلاً حتماً یک attribute خاص داشته باشه) یا اسمش تو یک لیست مرکزی ثبت بشه.
قدیم برای این کار از MetaClass استفاده می‌شد، اما الان با init_subclass فوق‌العاده ساده‌تره:

class PluginBase:
# لیستی برای ثبت خودکار تمام پلاگین‌ها
registry = {}

def __init_subclass__(cls, plugin_name=None, **kwargs):
super().__init_subclass__(**kwargs)

# ۱. اجبار فرزند به داشتن ویژگی مشخص
if not hasattr(cls, "author"):
raise TypeError(
f"کلاس {cls.__name__} باید متغیر author داشته باشه!"
)

# ۲. ثبت خودکار کلاس فرزند در سیستم
name = plugin_name or cls.__name__
cls.registry[name] = cls


# --------------------------------------------------
# حالا کلاس‌های فرزند چطور رفتار می‌کنند؟


class PaymentPlugin(PluginBase, plugin_name="zarinpal"):
author = "Amir" # اگر این نبود، پایتون ارور می‌داد!


print(PluginBase.registry)
# خروجی: {'zarinpal': <class '__main__.PaymentPlugin'>}

🔹 چرا این روش از Metaclass بهتره؟

* سادگی فوق‌العاده: نیnewدرگیر شدن با __new__ و مفاهیم سنگین Metaclasses نداری.

* قابلیت پاس دادن آرگومان: می‌تونی موقع ارث‌بری جلوی اسم کلاس والد، ورودی پاس بدی (PluginBase, plugin_name="zarinpal").

* کد تمیزتر (Clean Code): خوانایی برنامه رو برای باقی اعضای تیم چند برابر می‌کنه.


🔹 کاربرد اصلی: ساخت سیستم‌های Plugin، اتوماتیک‌سازی ثبت Modelها (مثل ORMها) و اعمال استانداردهای کدهای سازمانی روی کلاس‌های فرزند.

🐍 @python_rd
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 →