تابع super() در پایتون

تابع super() در پایتون به ما اجازه می‌دهد تا به کلاس پایه (superclass) به‌صورت ضمنی ارجاع دهیم. این قابلیت در ارث‌بری (inheritance) مفید است، وقتی که می‌خواهیم توابع کلاس پدر را فراخوانی کنیم.

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

مثال پایه

در آموزش نمونهٔ ارث‌بری پایتون، کلاس پایه Person و کلاس فرزند Student بود. در مثال زیر (به‌صورت خلاصه) در نسخه‌ای که نام کلاس پدر صریح نوشته شده است، فراخوانی به این شکل انجام شده است:

Person.__init__(self, student_name, student_age)

می‌توانیم این را با استفاده از super() به شکل زیر جایگزین کنیم:

super().__init__(student_name, student_age)

خروجی در هر دو حالت یکسان خواهد بود.

توجه داشته باشید که سینتکس بالا برای پایتون 3 است. اگر از پایتون 2.x استفاده می‌کنید، کمی متفاوت است و باید تغییراتی انجام دهید:

  • ابتدا کلاس Person باید از object ارث ببرد تا super قابل استفاده باشد.
  • سینتکس super در پایتون 2 نیاز به پارامتر دارد (مثلاً super(ClassName, self)).

پایتون 3 استفاده از super() را ساده‌تر و تمیزتر کرده است.

کارکرد در سطح چندگانهٔ ارث‌بری (چند سطحی)

همان‌طور که گفته شد، تابع super() به‌صورت ضمنی به کلاس پدر ارجاع می‌دهد. اما در حالت ارث‌بری چند سطحی، به کدام کلاس ارجاع می‌دهد؟ تابع super() همیشه به کلاس پدرِ مستقیم (immediate superclass) ارجاع می‌دهد. همچنین super() تنها برای __init__() نیست و می‌تواند هر تابع دیگری از کلاس پدر را نیز فراخوانی کند. مثال زیر این نکته را نشان می‌دهد:

class C(A,B):
    pass

و نمونه دیگری:

class FrameApp(Frame):
    def __init__(self, master):
        super(FrameApp, self).__init__(master)

در مثال چند سطحی، اگر توالی فراخوانی‌ها به شکل C → B → A باشد، super() به ترتیب هر پدر مستقیم را فراخوانی می‌کند.

نمونهٔ خروجی

اگر در مثال چند سطحی __init__() را در کلاس‌های بالا پیاده‌سازی کنید، خروجی ممکن است به این صورت باشد که اول تابع __init__() در کلاس C اجرا شود، سپس کلاس B و بعد کلاس A. همین ترتیب هنگام فراخوانی سایر متدها نیز رعایت می‌شود.

# مثال فرضی خروجی:
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

توضیح برای کاربران جاوا

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

امیدوارم این مطلب در مورد تابع super() در پایتون برای شما مفید بوده باشد.

می‌توانید کل اسکریپت پایتون و مثال‌های بیشتر را از مخزن GitHub مشاهده کنید:
https://github.com/journaldev/journaldev/tree/master/Python-3/basic_examples/

مرجع: مستندات رسمی
https://docs.python.org/3.7/library/functions.html#super

با تشکر از همراهی شما با جامعهٔ پارمین کلود. محصولاتی در حوزهٔ محاسبات، ذخیره‌سازی، شبکه‌بندی و پایگاه‌های دادهٔ مدیریت‌شده ارائه می‌کنیم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *