ارث بری (Inheritance) یکی از مفاهیم اساسی و قدرتمند در برنامهنویسی شیءگرا است که در زبانهای مختلف برنامهنویسی مورد استفاده قرار میگیرد. در پایتون نیز از این مفهوم استفاده میشود. ارثبری به برنامهنویسان این امکان را میدهد که یک کلاس جدید را بر اساس یک کلاس موجود (کلاس پایه یا پدر) تعریف کنند و از ویژگیها و متدهای موجود در کلاس پدر بهرهبرداری کنند. در این مقاله، با مفهوم ارث بری در پایتون آشنا میشویم، کاربردهای آن را مورد بررسی قرار میدهیم و نحوه استفاده از آن را به تفصیل بررسی میکنیم. پیشنهاد میکنیم از دیگر آموزشهای ما نیز دیدن فرمایید:
مفهوم ارث بری در پایتون
ارثبری به برنامهنویسان این امکان را میدهد که یک کلاس (کلاس فرزند) جدید را بر اساس یک کلاس موجود (کلاس والد یا کلاس پایه) تعریف کنند و از ویژگیها و متدهای موجود در کلاس والد بهرهبرداری کنند. کلاس فرزند به کلاس والد ارث میبرد و میتواند ویژگیهای اضافی به آن اضافه کند یا ویژگیهای موجود را تغییر دهد.
ارثبری در پایتون به وسیله استفاده از نام کلاس والد در تعریف کلاس فرزند انجام میشود. به عنوان مثال، فرض کنید یک کلاس والد به نام Animal
داریم که ویژگیها و متدهای مشترک برای تمام حیوانات را داراست. حالا میخواهیم یک کلاس فرزند به نام Dog
تعریف کنیم که از کلاس Animal
ارثبری کند:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name} وفادار است و ووف میکند."
در این مثال، کلاس Dog
از کلاس Animal
ارثبری کرده است. این به این معناست که کلاس Dog
تمام ویژگیها و متدهای کلاس Animal
را به ارث میبرد و میتواند ویژگیها و متدهای خود را نیز داشته باشد. در واقع، ما متد speak
را در کلاس Dog
بازنویسی کردهایم تا ویژگیهای خاص حیواناتی مانند سگ را پیادهسازی کند.
حالا میتوانیم یک شیء از کلاس Dog
ایجاد کنیم و از ویژگیها و متدهای آن بهرهبرداری کنیم:
dog = Dog("rex")
print(dog.name) # خروجی: "rex"
print(dog.speak()) # خروجی: "rex وفادار است و ووف میکند."
کاربردهای ارث بری در پایتون
ارث بری در پایتون در موارد مختلفی مورد استفاده قرار میگیرد و به برنامهنویسان امکانات متعددی را ارائه میدهد. در زیر به برخی از کاربردهای ارثبری در پایتون اشاره میکنیم:
- ساختارسازی بهتر کد: ارثبری به برنامهنویسان امکان میدهد که کدهای مشترک بین کلاسها را در یک کلاس والد تعریف کنند و کدهای تکراری را کاهش دهند. این منجر به ساختارسازی بهتر کد میشود.
- پلیمورفیسم یا چندریختی: ارثبری به برنامهنویسان این امکان را میدهد که چندین کلاس فرزند از یک کلاس والد را تعریف کنند و به ویژگیها و متدهای مشترک والد به شکل متفاوتی پاسخ دهند. این ویژگی به عنوان پلیمورفیسم شناخته میشود و به افزایش انعطافپذیری کد کمک میکند.
- تعریف یک سلسله مراتب: با استفاده از ارثبری، میتوانید یک سلسله مراتب از کلاسها ایجاد کنید که هر کلاس فرزند وابسته به تعدادی کلاس دیگر باشد. این به شما این امکان را میدهد که تقسیم بندی منطقی کد خود را انجام دهید.
- کاهش تکرار کد: با تعریف ویژگیها و متدهای مشترک در یک کلاس والد، میتوانید از تکرار کدهای مشابه در کلاسهای مختلف جلوگیری کنید و کد خود را سادهتر و مدیریتپذیرتر کنید.
نحوه استفاده از ارثبری
استفاده از ارث بری در پایتون بسیار ساده است. برای ارثبری از یک کلاس والد، کلاس فرزند را با نام کلاس والد تعریف کرده و نام کلاس والد را در داخل پرانتز تعیین کنید. سپس میتوانید ویژگیها و متدهای اضافی را به کلاس فرزند اضافه کنید یا متدهای موجود را بازنویسی کنید.
class ParentClass:
# ویژگیها و متدهای کلاس پدر
class ChildClass(ParentClass):
# ویژگیها و متدهای کلاس مشتق
مثال عملی
برای مثال، فرض کنید که میخواهیم یک کلاس Shape
(شکل) تعریف کنیم که ویژگیای مشترک برای همه اشکال همچون مساحت داشته باشد. سپس میخواهیم دو کلاس فرزند به نامهای Rectangle
(مستطیل) و Circle
(دایره) تعریف کنیم که از کلاس Shape
ارثبری کنند و ویژگیها و متدهای خاص خود را داشته باشند.
class Shape:
def __init__(self, color):
self.color = color
def area(self):
pass
class Rectangle(Shape):
def __init__(self, color, width, height):
super().__init__(color)
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, color, radius):
super().__init__(color)
self.radius = radius
def area(self):
import math
return math.pi * self.radius ** 2
در مثال ارث بری در پایتون، کلاس Shape
کلاس والد است که ویژگی مشترک color
را دارد و متد area
را تعریف کرده است (با پیشفرض خالی). سپس دو کلاس Rectangle
و Circle
از کلاس Shape
ارثبری کردهاند. هر کدام از این کلاسها ویژگیهای خود را دارند (مانند width
و height
برای Rectangle
و radius
برای Circle
) و متد area
را بازنویسی کردهاند تا محاسبه مساحت شکل مخصوص به خود را انجام دهند.
حالا میتوانیم شیءهایی از این کلاسها ایجاد کنیم و از ویژگیها و متدهای آنها بهرهبریم:
rectangle = Rectangle("قرمز", 5, 10)
circle = Circle("آبی", 7)
print(rectangle.color) # خروجی: "قرمز"
print(rectangle.area()) # خروجی: 50
print(circle.color) # خروجی: "آبی"
print(circle.area()) # خروجی: 153.93804002589985
استفاده از ()super
در مثال بالا، ما از تابع super()
برای فراخوانی متد معادل در کلاس والد استفاده کردیم. این تابع به ما امکان میدهد تا به متدهای کلاس والد دسترسی پیدا کنیم و آنها را از کلاس فرزند فراخوانی کنیم. در مثال Rectangle
و Circle
، ما از super().__init__(color)
برای فراخوانی متد __init__
کلاس والد برای مقداردهی ویژگی color
استفاده کردیم.