تابع 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
با تشکر از همراهی شما با جامعهٔ پارمین کلود. محصولاتی در حوزهٔ محاسبات، ذخیرهسازی، شبکهبندی و پایگاههای دادهٔ مدیریتشده ارائه میکنیم.






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