0
سبد خرید من 0 دوره
سبد خرید شما خالیست :(
پرسش

درک استفاده از تابع super() در متدهای __init__ پایتون

Understanding Python super() with __init__ methods

چطوری می‌تونم در پایتون از تابع super() در متد __init__ استفاده کنم؟ وقتی که این تابع رو توی کلاس‌های فرزند فراخوانی می‌کنم، دقیقاً چه اتفاقی می‌افته و چرا باید ازش استفاده کنم؟ اگر چند کلاس والد داشته باشیم، super() چطور کار می‌کنه؟

1403/05/31
پاسخ
رضا دولتی عاشق برنامه نویسی و هوش مصنوعی!
بیوگرافی رضا دولتی

تابع super() در پایتون برای فراخوانی متدها از کلاس والد استفاده می‌شه و بیشتر در کلاس‌های فرزند کاربرد داره. این تابع به شما اجازه می‌ده که به متدهای والد دسترسی داشته باشید و اون‌ها رو گسترش بدید. وقتی توی __init__ از super() استفاده می‌کنید، متد __init__ کلاس والد فراخوانی می‌شه و باعث می‌شه که ویژگی‌های کلاس والد به درستی مقداردهی بشن.

یه مثال ساده:

class Parent:
    def __init__(self, name):
        self.name = name
class Child(Parent):
    def __init__(self, name, age):
        super().__init__(name)  # Call the Parent's __init__ method
        self.age = age
c = Child("Reza", 25)
print(c.name)  # Outputs: Reza
print(c.age)   # Outputs: 25

توی این مثال، کلاس Child از Parent ارث‌بری می‌کنه و با استفاده از super().__init__(name) مطمئن می‌شیم که __init__ کلاس والد هم اجرا می‌شه و ویژگی name به درستی مقداردهی می‌شه.

اگر چند کلاس والد داشته باشیم، پایتون از یه سیستم به اسم MRO (Method Resolution Order) استفاده می‌کنه که ترتیب فراخوانی متدها رو مشخص می‌کنه. توی این حالت هم super() به ترتیب کلاس‌ها در MRO عمل می‌کنه.

مثلاً:

class A:
    def __init__(self):
        print("A's __init__")
class B(A):
    def __init__(self):
        super().__init__()
        print("B's __init__")
class C(A):
    def __init__(self):
        super().__init__()
        print("C's __init__")
class D(B, C):
    def __init__(self):
        super().__init__()
        print("D's __init__")
d = D()

خروجی این کد به این صورته:

A's __init__
C's __init__
B's __init__
D's __init__

همون‌طور که می‌بینی، پایتون ابتدا __init__ کلاس A رو اجرا می‌کنه، بعد C، بعد B، و در نهایت D. این ترتیب توسط MRO تعیین می‌شه.

استفاده از super() باعث می‌شه که کد شما تمیزتر و قابل نگهداری‌تر بشه، مخصوصاً وقتی با وراثت پیچیده و چندگانه سروکار دارید.

بنابراین، super() یه راه قدرتمند برای کار با کلاس‌های والد و فرزند توی پایتونه و اگه به درستی استفاده بشه، می‌تونه کد شما رو خیلی بهینه‌تر و قابل فهم‌تر کنه.

پاسخ: 1403/05/31
آخرین آپدیت: 1403/07/16