ساخت کلاسهای سفارشی در پایتون: مفاهیم متوسط
در مقالات قبلی با مفاهیم پایه برنامهنویسی شیءگرا (OOP) و تعریف کلاسها در پایتون آشنا شدیم. حال در این مقاله، به بررسی عمیقتر ساخت کلاسهای سفارشی و کاربردهای آنها میپردازیم. این مقاله در سطح ‘مفاهیم متوسط’ قرار دارد و پیشفرض بر این است که خواننده با اصول اولیه کلاسها و اشیاء در پایتون آشنایی دارد.
چرا به کلاسهای سفارشی نیاز داریم؟
کلاسهای سفارشی به ما امکان میدهند تا مدلهای دادهای پیچیده و رفتارهای مرتبط با آنها را به صورت سازمانیافته و قابل استفاده مجدد تعریف کنیم. به جای تکرار کد و استفاده از متغیرها و توابع پراکنده، میتوانیم یک کلاس ایجاد کنیم که تمام اطلاعات و عملیات مربوط به یک مفهوم خاص را در خود جای دهد. این امر باعث افزایش خوانایی، نگهداری و قابلیت توسعه کد میشود.
تعریف کلاسهای سفارشی: گام به گام
برای تعریف یک کلاس سفارشی، از کلمه کلیدی class استفاده میکنیم. نام کلاس معمولاً با حرف بزرگ شروع میشود (به عنوان یک قرارداد). در داخل کلاس، میتوانیم متغیرها (attributes) و توابع (methods) را تعریف کنیم. متغیرها دادههای مربوط به اشیاء کلاس را نگهداری میکنند و توابع عملیاتی را که میتوان روی اشیاء کلاس انجام داد، تعریف میکنند.
به عنوان مثال، فرض کنید میخواهیم یک کلاس برای نمایش یک دایره تعریف کنیم:
class Circle:
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14159 * self.radius * self.radius
def circumference(self):
return 2 * 3.14159 * self.radius
در این مثال:
class Circle:تعریف کلاس با نام Circle را آغاز میکند.def __init__(self, radius):این تابع سازنده (constructor) کلاس است. هنگامی که یک شیء از کلاس Circle ایجاد میشود، این تابع به طور خودکار فراخوانی میشود. پارامترselfبه خود شیء اشاره دارد وradiusشعاع دایره را دریافت میکند.self.radius = radiusمقدار شعاع را در متغیرradiusشیء ذخیره میکند.def area(self):این تابع مساحت دایره را محاسبه و برمیگرداند.def circumference(self):این تابع محیط دایره را محاسبه و برمیگرداند.
استفاده از کلاسهای سفارشی
برای ایجاد یک شیء از کلاس Circle، از نام کلاس به عنوان یک تابع استفاده میکنیم و مقادیر مورد نیاز برای سازنده را به عنوان آرگومان ارسال میکنیم:
my_circle = Circle(5) print(my_circle.area()) print(my_circle.circumference())
در این مثال، یک شیء به نام my_circle از کلاس Circle ایجاد شده است که شعاع آن 5 است. سپس با استفاده از متد area() و circumference() مساحت و محیط دایره را محاسبه و چاپ میکنیم.
وراثت (Inheritance)
وراثت یکی از مفاهیم کلیدی برنامهنویسی شیءگرا است که به ما امکان میدهد تا کلاسهای جدیدی را بر اساس کلاسهای موجود ایجاد کنیم. کلاس جدید (کلاس فرزند) تمام ویژگیها و متدهای کلاس موجود (کلاس والد) را به ارث میبرد و میتواند ویژگیها و متدهای جدیدی را نیز اضافه کند یا ویژگیها و متدهای موجود را بازنویسی کند.
به عنوان مثال، فرض کنید میخواهیم یک کلاس برای نمایش یک استوانه تعریف کنیم. استوانه دارای شعاع و ارتفاع است. میتوانیم کلاس Cylinder را بر اساس کلاس Circle تعریف کنیم:
class Cylinder(Circle):
def __init__(self, radius, height):
super().__init__(radius)
self.height = height
def volume(self):
return 3.14159 * self.radius * self.radius * self.height
در این مثال:
class Cylinder(Circle):تعریف کلاس Cylinder را آغاز میکند و مشخص میکند که این کلاس از کلاس Circle ارث میبرد.super().__init__(radius)سازنده کلاس والد (Circle) را فراخوانی میکند تا شعاع دایره را مقداردهی اولیه کند.self.height = heightمقدار ارتفاع را در متغیرheightشیء ذخیره میکند.def volume(self):این تابع حجم استوانه را محاسبه و برمیگرداند.
اکنون میتوانیم یک شیء از کلاس Cylinder ایجاد کنیم و از متدهای کلاس Circle نیز استفاده کنیم:
my_cylinder = Cylinder(5, 10) print(my_cylinder.area()) # استفاده از متد area از کلاس Circle print(my_cylinder.volume())
چندریختی (Polymorphism)
چندریختی به معنای توانایی داشتن اشکال مختلف است. در برنامهنویسی شیءگرا، چندریختی به ما امکان میدهد تا اشیاء مختلف را به یک روش یکسان مورد استفاده قرار دهیم. این امر با استفاده از متدهای یکسان با نامهای مشابه در کلاسهای مختلف امکانپذیر میشود.
به عنوان مثال، فرض کنید میخواهیم یک کلاس برای نمایش یک مستطیل تعریف کنیم. مستطیل دارای طول و عرض است. میتوانیم یک متد به نام area() را در کلاسهای Circle و Rectangle تعریف کنیم که مساحت هر شکل را محاسبه کند:
class Rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def area(self):
return self.length * self.width
اکنون میتوانیم یک لیست از اشیاء مختلف (Circle و Rectangle) ایجاد کنیم و متد area() را روی هر شیء فراخوانی کنیم. هر شیء متد area() خود را اجرا میکند و مساحت مربوط به خود را برمیگرداند.
کپسولهسازی (Encapsulation)
کپسولهسازی به معنای پنهان کردن جزئیات پیادهسازی داخلی یک کلاس و ارائه یک رابط کاربری ساده و مشخص برای تعامل با آن است. این امر باعث افزایش امنیت و نگهداری کد میشود.
در پایتون، میتوانیم با استفاده از قرارداد نامگذاری (نامگذاری متغیرها و متدهای خصوصی با پیشوند دو خط تیره __) و ویژگیهای دسترسی (public, protected, private) کپسولهسازی را پیادهسازی کنیم. متغیرها و متدهایی که با دو خط تیره شروع میشوند، به عنوان خصوصی در نظر گرفته میشوند و فقط از داخل کلاس قابل دسترسی هستند.
به عنوان مثال:
class BankAccount:
def __init__(self, account_number, balance):
self.__account_number = account_number
self.__balance = balance
def deposit(self, amount):
self.__balance += amount
def withdraw(self, amount):
if amount <= self.__balance:
self.__balance -= amount
else:
print("Insufficient funds")
def get_balance(self):
return self.__balance
در این مثال، متغیرهای __account_number و __balance به عنوان خصوصی تعریف شدهاند و فقط از داخل کلاس قابل دسترسی هستند. متدهای deposit()، withdraw() و get_balance() رابط کاربری برای تعامل با حساب بانکی را ارائه میدهند.
نتیجهگیری
در این مقاله، به بررسی عمیقتر ساخت کلاسهای سفارشی در پایتون پرداختیم. با استفاده از مفاهیم وراثت، چندریختی و کپسولهسازی، میتوانیم کلاسهای پیچیده و قدرتمندی را ایجاد کنیم که به ما در حل مسائل مختلف کمک میکنند. درک این مفاهیم برای تبدیل شدن به یک برنامهنویس پایتون ماهر ضروری است.

بدون دیدگاه