🔹 چطور موقع ارثبری، کلاس فرزند رو خودکار اعتبارسنجی یا ثبت کنیم؟
فرض کن داری یک فریمورک، 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