
به کمک ارث بری در پایتون میتوانیم ویژگیها و رفتارهای یک کلاس را از کلاس بالاتر به ارث ببریم. مثلاً کلاس گربه از کلاس حیوان ارثبری میکند تا مجبور نباشیم همه عملکردها را مجدداً تعریف کنیم. در این آموزش نحوه ارثبری یا inheritance در پایتون را یاد میگیریم.
در اصول برنامه نویسی شی گرا یک بحث اساسی به نام ارثبری در کلاسها داریم. به کمک ارث بری یا inheritance ویژگیها و رفتارهای یک کلاس از کلاس بالاتر به ارث گرفته میشود.
دقیقاً همانطور که در تولیدمثل انسانها، فرزندان ویژگیها و رفتارهایی را از والدین خود به ارث میبرند. البته هر فرزند میتواند ویژگیها و رفتارهای منحصربهفرد خودش را نیز داشته باشد.
برای تطابق بهتر ارث بری در پایتون با دنیای واقعی، یک مثال کوچک دیگر میزنم. فرض کنید کلاسی به نام «Pet» داریم که حیوان خانگی ما است.
در اینصورت میتوان زیرکلاسهایی مثل گربه و سگ داشته باشیم. هر دوی آنها نوعی Pet هستند که علاوه بر دارا بودن ویژگیهای Pet، خصوصیتها و رفتارهای منحصربهفردی نیز دارند.
فهرست محتوای آموزش
ارث بری در پایتون
همگی با تعریف کلاس در پایتون آشنا هستیم. برای اینکه یک کلاس از کلاس دیگری ارث بری کند، از پرانتز در جلوی نام کلاس استفاده میکنیم.
فرض کنید دو کلاس A و B داریم. میخواهیم B از Aارثبری کند، یعنی همه propertyها و methodهای آن را در خودش داشته باشد. برای این کار ساختاری مشابه زیر خواهیم داشت:
class A:
pass # class A body
class B(A):
pass # class B body
مثالی از ارث بری پایتون
برگردیم به آخرین مثالی که زدم. ابتدا یک کلاس به نام Pet برای حیوان خانگی در پایتون در نظر میگیریم. در سازندهی این کلاس، نام، رنگ و سن پت را تعریف میکنیم. همچنین دو متد داریم:
- متد
getName()
نام او را برمیگرداند. - متد
makeSound()
در حالت کلی یک متن بیربط را چاپ میکند. واضح است که صدای گربه و سگ متفاوت است. در جلوتر یاد میگیریم این متدها را برای هر کلاس مجدداً تعریف کنیم.
class Pet:
def __init__(self, name, color, age):
self.name = name
self.color = color
self.age = age
def getName(self):
return self.name
def makeSound(self):
print("bla bla bla")
به زبان خیلی ساده، متد تابعی است که در کلاس تعریف میشود و به واسطه شئ (object)های آن کلاس در دسترس خواهد بود. اگر به توابع تسلط ندارید، آموزش تابع در پایتون را ببینید.
حالا کلاس Cat را تعریف میکنم. یک متد ساده برای اینکه مشخص کنیم گربه در حال دنبال کردن موش است نیز در آن تعریف میکنم:
class Cat(Pet):
def chasingRat(self):
print("It's chasing rat!")
حالا یک نمونه (شئ) از گربه میسازم:
kitty = Cat("Kitty", "white", 2)
به کمک IDE بررسی میکنم که به چه متدها و ویژگیهایی روی این شیء دسترسی دارم:

همانطور که میبینید، هم میتوانم متدها و ویژگیهای کلاس Pet را استفاده کنم و هم کلاس Cat. این مسئله یعنی ارث بری در پایتون! 🙂
اگر دقت کنید، در هنگام ایجاد گربه نیز از سازنده کلاس والد (parent) استفاده شده است. در قطعه کد زیر، به متدهای مختلف آن دسترسی پیدا میکنم:
print(kitty.getName()) # Kitty
kitty.chasingRat() # It's chasing rat!
بازنویسی در کلاس فرزند
وقتی میخواهیم یک متد در کلاس والد را در کلاس فرزند (child) دوبارهنویسی کنیم، به آن Method Overriding گفته میشود. من میخواهیم متد makeSound()
را در کلاس Cat بازنویسی کرده و بدنه آن را تغییر دهم.
class Cat(Pet):
def chasingRat(self):
print("It's chasing rat!")
def makeSound(self):
print("meowwww!")
حالا اگر از کلاس Cat یک شئ ساخته و makeSound()
را صدا بزنیم، متد درون کلاس Cat اجرا خواهد شد. به همین سادگی توانستیم بازنویسی متد در هنگام ارث بری در پایتون را انجام دهیم.
kitty = Cat("Kitty", "white", 2)
kitty.makeSound()
در IDEهای مختلف، معمولاً توابعی که در هنگام ارثبری override میشوند را با علامت یا حتی تغییر رنگ مشخص میکنند. مثلاً در PyCharm در کنار نام متد، چنین علامتی قرار داده میشود:

نکات مهم ارثبری در پایتون
دیدید که به همین سادگی توانستیم بین دو کلاس ارثبری کنیم. بهتر است ۲ نکته بسیار مهم را نیز با هم مرور کرده و یاد بگیریم:
ارثبری چندگانه در پایتون
زبان پایتون از ارثبری چندگانه پشتیبانی میکند. یعنی هر کلاس میتواند همزمان از دو یا چند کلاس دیگر inheritance کند.
برای ارث بری چندگانه در پایتون، کافی است نام کلاسهای والد را با کاما (,
) جدا کرده و مشابه قبل عمل کنیم:
class A:
# body
class B:
# body
class C(A, B):
# body of C that inherited from A, B
دقت کنید که ترتیب این کلاسها اهمیت دارد. بررسی تأثیر ترتیب آنها از بحث این آموزش خارج است. اما در همین حد بدانید که اگر چند متد همنام در این کلاسها وجود داشته باشد، متدی که در سمت راستترین کلاس وجود دارد روی بقیه بازنویسی خواهد شد.
ارث بری سلسله مراتبی
احتمالاً تا اینجا حدس زدهاید که میتوانیم ارثبری متوالی در کلاسهای پایتون داشته باشیم. اگر مثال اصلی آموزش را در نظر بگیریم، حیوان خانگی خودش از کلاس حیوانات ارثبری کرده است. بنابراین میتوانیم ساختاری مشابه زیر نیز داشته باشیم.
برای اینکه کدها طولانی نشود، بدنه کلاسها را حذف کرده و از کلمه کلیدی pass استفاده کردهام.
کلاس والد در ارث بری پایتون
گاهی اوقات لازم است در کلاس فرزند، به متدهای کلاس والد دسترسی داشته باشیم. برای این کار دو روش داریم:
- استفاده از تابع
super()
برای دسترسی به کلاس والد - استفاده از نام کلاس والد و دسترسی به متدهای آن
فرض کنید میخواهم در سازنده Cat رنگ چشم گربه را نیز بگیرم. برای این کار میتوانم کل بدنه را بازنویسی کنم؛ یعنی مقداردهی همه متغیرها را مجدداً انجام دهم. همچنین میتوانم مشابه کد زیر، از سازنده Pet کمک بگیرم:
class Pet:
def __init__(self, name, color, age):
self.name = name
self.color = color
self.age = age
class Cat(Pet):
def __init__(self, name, color, age, eye_color):
super().__init__(name, color, age)
self.eye_color = eye_color
kitty = Cat("Kitty", "white", 2, "black")
اگر بخواهیم به روش دوم عمل کنیم، کلاس فرزند به حالت زیر تغییر میکند. دقت کنید که در این روش، مجبوریم self را به عنوان آرگومان ورودی به متدی که فراخوانی کردهایم بدهیم.
class Cat(Pet):
def __init__(self, name, color, age, eye_color):
Pet.__init__(self, name, color, age)
self.eye_color = eye_color
پیشنهاد: اگر کلاس از فقط از یک کلاس ارثبری کرده است، از super()
و در ارثبری چندگانه در پایتون، از نام کلاسها استفاده کنید.
پیشنهاد میکنم همین الآن ۲ یا ۳ کلاس (متفاوت با مثالی که زدم) بنویسید و چند متد و ویژگی در آنها تعریف کنید. سعی کنید بین اینها ارث بری چندگانه برقرار کنید. اگر دوست داشتید، مستندات انگلیسی آن توضیحات متنی بیشتری درباره فرآیند ارثبری ارائه کرده است.
به زودی یک فیلم آموزشی همراه با مثالی از کلاسهای Person و User منتشر میکنم تا مفاهیم ارث بری در پایتون برایتان مرور شود.
این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون
این آموزش برای همیشه رایگانه! میتونید با اشتراکگذاری لینک این صفحه از ما حمایت کنید یا با خرید یه فنجون نوشیدنی بهمون انرژی بدید!
میخوام یه نوشیدنی مهمونتون کنم
سلام
خیلی عالی و با بیانی ساده و در عین حال قدرتمند.
من متن را کامل درک کردم.
سپاسگزارم
سلام سیروس عزیز
خوشحالم که برات مفید بوده 🙂
سلام وعرض ادب.وقتی در پایتون از
()super
استفاده می کنیم کلیه خصوصیات را به ارث می بره ومنتقل می کنه .اگه ما نخوایم همه خصوصیات رو منتقل کنه باید از چه روشی استفاده کنیم.سلام
در اصل super برای اشاره به والد هست. وگرنه وقتی ارثبری انجام میشه تمام خصوصیات رو منتقل میکنید. البته از Access Modifier ها میتونیم برای محدود کردن دسترسی به ویژگیها و متدها در بیرون کلاس (شیء) و تا حدی فرزندان استفاده کنیم. در آپدیت دوره (جلسه بعدی همین آموزش که اواخر هفته آینده منتشر میشه) در موردشون صحبت میکنیم.
Pass چیه؟
اگه بدنه یه چیزی رو خالی بذاریم خطا میده. وقتی فعلاً چیزی نداریم و میخوایم خالی بذاریمش pass میذاریم. به این معنی که از این خط عبور کن و ادامه بده. (هیچ کاری نکن)
توی تمرینهایی که در دوره مکمل گفته شده ازش چند مثال ساده داریم.
ممنون
این آخرین جلسه بود؟؟
تا الآن بله
یکسری جلسات اضافی و مکمل هست که اکثرش در دوره رایگان مکمل و بخشیش در ادامه همین دوره طی چند هفته آینده منتشر میشه. اما عناوین اصلی زبان پایتون رو میشه گفت تا همینجاست.
سلام وقتتون بخیر
اگه بخوایم مقدار یک ایتم رو در کلاس تغییر بدیم باید چجوری کدش رو بنویسیم؟؟؟
مثلا یک کلاس ۲ ایتم name و family داره بعد مقدار های این ۲ ایتم در یک لیست ذخیره شده
از کاربر سوال میشه که میخواد کدوم ایندکس رو تغییر بده بعد مقدار جدید رو وارد میکنه و اون ها جایگزین مقدار قبلی در اون ایندکس میشن
این کدش رو میشه لطف کنید راهنمایی کنید🙏
سلام
الان دو تا ویژگی مختلف برای کلاستون در نظر گرفتید یا یه ویژگی هست به صورت لیست؟!
در هر صورت شما میتوانید با نوشتن یه متد برای کلاس این تغییر رو انجام بدید. نوشتن متد شبیه یک تابعه.
بابت انتشار آگهی سپاسگزارم
بابت مطلبی که گفتید شاید باورتون نشه بعضی از افراد واژه ها و جملاتی رو نمی دونند که واسه شما چون رشته یا شاید کارتون اینه ، راحته (مثلاً تو رشته کشاورزی واژه “هیدروپونیک” به معنی “آب کشت یا بدون خاک” هست که شاید رشته فناوری اطلاعات ندونه ولی واسه اونها راحته حالا واسه عموم “آب کشت” خیلی قابل درک تره تا “هیدروپونیک”) همچنین بعضی ها مقاله قرار می دهند داخل وبگاهی ، بعد مفهوم بعضی از واژه ها رو اشتباه می نویسند مثلاً در مقاله زیر قسمت “خلاصه” طرف نوشته “یارانه” به جای “رایانه”
راجب پرسشی که داشتید اینو بگم در حال حاضر به صورت دستی دارم اینکار رو انجام می دم البته نرم افزار کاربردی نوشتم (به زبان C#) که دو زبان انگلیسی و فارسی رو پشتیبانی می کنه اما مربوط به این مطلب نیست ولی تو فکرم هست تابعی بنویسم که وقتی یک مقاله نویس و یا کاربر مطلبی رو داخل وبگاهی قرار داد ، خودکار واژه هاشو درست کنه (به شرطی که زمان داشته باشم و مدیران وبگاه ها همکاری داشته باشند)
باز هم سپاس
بله دقیقاً. این مورد مفهومتر بودن که میگید درسته. ولی ما سعی کردیم مفاهیم رو برای کسی که جلسات رو به ترتیب پیش میاد تعریف کنیم تا تفاوتشون رو درک کنند. به همین خاطر در جلساتی از دورهها (مثل همین صفحه) که بحثهای پیشرفتهتر هست، از کلمات تخصصی بیشتر استفاده کردیم.
قبلاً یه پلاگین برای ورد بود به نام ویراستیار. مدتی توسعه پیدا کرد و رها شد. شخصاً ازش برای اصلاحات مروری استفاده میکنم. پیشنهاد میکنم یه نگاهی هم بهش بندازید. موفق باشی رضای عزیز
سلام و درود
مطلب اول: در انتخاب کلید واژه بهترِ شما هم از کلید واژه کاملاً پارسی ، هم غیر پارسی (عربی ، انگلیسی و …) استفاده کنید.
برای نمونه: دو جمله “دیپلماسی غرب نسبت به ایران” و ” سیاست غرب نسبت به ایران” رو در نظر بگیرید ، افرادی اولی رو جستجو می کنند ، افرادی هم دومی رو جستجو می کنند حالا اگر شما یکی از دو واژه را در کلید واژه های خودتون استفاده نـــکنید ، اگر کسی یکی از آنها را جستجو کند و مرتبط با کلید واژه شما نباشد ، وبگاه یا تارنمای شما در تمامی جستجوگرها ( Yandex ، Bing ، Google و …) بالا نمی آید.
مطلب دوم: اما در متن مقاله از واژه های پارسی استفاده کنید گسترش زبان پارسی می تواند برای ما سودهای اقتصادی به دنبال داشته باشد.
برای نمونه بسیار کوچک: استخدام استاد و کارشناس زبان پارسی در ایالات متحده با در آمد $50K – $63.2K
همچنین خیلی افراد (حتی تحصیل کرده و حتی مربوط به رشته خودشون) ، مفهوم بعضی از واژه های بیگانه رو نمی دونند.
من در بخش بهبود ترجمه Google شرکت می کنم (در آیند برای جستجوگر Bing هم انجام می دم) و واژه های پارسی به گوگل پیشنهاد می دم
پس این واژها رو جایگزین کنید: رزومه=سابقه کار | کد=دستور ، شماره ، رمز ، پیش شماره | متد=تابع | فالو می کنم=دنبال می کنم ، پیج=صفحه ، ایمیل=رایانامه
در حالت کلی وبگاه شما خیلی بهتر از سایر وبگاه ها در زمینه درست نویسی و پاسداشت پارسی است
سپاسگزارم
سلام
خیلی ممنونم رضای عزیز بابت وقتی که گذاشتی و این موارد رو اطلاع دادی.
به شخصه خودم و تیم مجموعه همیشه تلاش میکنیم از معادلهای پارسی و حتی نگارش صحیح استفاده کنیم. اما دو تا چالش داریم:
اولیش اینکه بعضی معادلها، مفهوم مناسب رو منتقل نمیکنند. مثلاً شما گفتید بهجای متد (method) از تابع (function) استفاده بشه. میدونیم که از نظر ساختاری این دو مفهوم تا حدی متفاوت هستند؛ متد بهنوعی تابعیه که در کلاس پیادهسازی میشه.
بعضی کلمات هم چون جاافتادهتر هستند استفاده میکنیم (مثل فالو کردن یا ایمیل)
دومیش هم که خودتون در ابتدا اشاره کردید: بحث کلمات عامتری که جستجو میشوند.
باز هم ممنون بابت پیشنهاداتت. در حال توسعه برنامهای برای این هدف هستید یا بهصورت دستی انجام میدید؟
اگه برنامه متنبازی در این مورد هست خوشحال میشم بتونم در آینده توی توسعه اون همکاریهایی داشته باشیم. 🙂
موفق باشی
سلام دوست عزیز
من تا حدودی کار با پایتون رو آموزش دیدم
برای اینکه بیشتر یاد بگیرم و حرفه ای بشم باید کار بگیرم اگه میشه برای کار پیدا کردن مشورت بدین که چه کار انجام بدم
ضمنا با توجه به شرایط نمیتونم کار حضوری بگیرم ممنون میشم راهنمایی بکنید
سلام
راستش جوابتون رو نمیشه توی یه کامنت داد! اگر تجربه ندارید و نمیتونید کارآموزی برید، معمولاً پیشنهاد میکنم چند پروژه بنا به نیازتون یا از اینترنت پیدا کنید و سعی کنید خودتون پیادهسازیش کنید. اینطوری هم با چالشهای نوشتن یه برنامه کامل برخورد میکنید و هم نتیجهاش یه رزومهی اولیه براتون خواهد بود.
داریم سعی میکنیم از چند روز دیگه پیج اینستاگراممون رو دوباره فعال کنیم. سعی میکنم اونجا در مورد این مسائل بیشتر صحبت کنم. پیشنهاد میکنم پیجمون به آدرس sabzdanesh رو فالو کنین.
خیلی عالی من مبحث کلاس رو درک کردم
خیلی خوشحالیم که این آموزش براتون کاربردی بوده. ممنون برای انرژی خوبتون. موفق باشید ماریای عزیز.
دستخوش