تعریف و استفاده از کلاسها در پایتون – مبانی پایتون
در برنامهنویسی، کلاسها ابزاری قدرتمند برای سازماندهی کد و ایجاد ساختارهای دادهای پیچیده هستند. پایتون به عنوان یک زبان برنامهنویسی شیءگرا، از کلاسها به طور گسترده پشتیبانی میکند. این مقاله به بررسی عمیق مفهوم کلاسها، نحوه تعریف آنها و کاربردهای مختلف آنها در پایتون میپردازد.
مقدمهای بر برنامهنویسی شیءگرا (OOP)
برنامهنویسی شیءگرا یک پارادایم برنامهنویسی است که بر اساس مفهوم “اشیاء” بنا شده است. یک شیء، مجموعهای از دادهها (ویژگیها) و توابع (متدها) است که بر روی آن دادهها عمل میکنند. کلاسها به عنوان طرحی برای ایجاد اشیاء عمل میکنند. به عبارت دیگر، یک کلاس تعریف میکند که یک شیء چه ویژگیهایی دارد و چه کارهایی میتواند انجام دهد.
چهار اصل اساسی در برنامهنویسی شیءگرا وجود دارد:
- انتزاع (Abstraction): پنهان کردن جزئیات پیچیده و ارائه یک رابط کاربری ساده.
- کپسولهسازی (Encapsulation): بستهبندی دادهها و متدها در یک واحد (کلاس) و محافظت از دادهها در برابر دسترسی غیرمجاز.
- وراثت (Inheritance): ایجاد کلاسهای جدید بر اساس کلاسهای موجود، به طوری که کلاس جدید ویژگیها و متدهای کلاس والد را به ارث ببرد.
- چندریختی (Polymorphism): امکان استفاده از یک رابط کاربری برای اشیاء مختلف.
تعریف کلاس در پایتون
برای تعریف یک کلاس در پایتون، از کلمه کلیدی class استفاده میکنیم. نام کلاس معمولاً با حرف بزرگ شروع میشود (این یک قرارداد است، اما اجباری نیست). داخل کلاس، میتوان ویژگیها (متغیرها) و متدها (توابع) را تعریف کرد.
class Dog:
def __init__(self, name, breed):
self.name = name
self.breed = breed
def bark(self):
print("Woof!")
در این مثال، کلاس Dog تعریف شده است. __init__ یک متد خاص است که به عنوان سازنده (constructor) شناخته میشود. این متد زمانی فراخوانی میشود که یک شیء جدید از کلاس ایجاد میشود. پارامتر self به خود شیء اشاره دارد و برای دسترسی به ویژگیها و متدهای شیء استفاده میشود. در این مثال، سازنده دو پارامتر name و breed را میگیرد و آنها را به عنوان ویژگیهای شیء تنظیم میکند. متد bark یک متد ساده است که پیام “Woof!” را چاپ میکند.
ایجاد شیء از کلاس
برای ایجاد یک شیء از کلاس، نام کلاس را مانند یک تابع فراخوانی میکنیم و آرگومانهای مورد نیاز برای سازنده را ارسال میکنیم.
my_dog = Dog("Buddy", "Golden Retriever")
در این مثال، یک شیء جدید از کلاس Dog با نام my_dog ایجاد شده است. نام سگ “Buddy” و نژاد آن “Golden Retriever” است.
دسترسی به ویژگیها و متدها
برای دسترسی به ویژگیها و متدهای یک شیء، از عملگر نقطه (.) استفاده میکنیم.
print(my_dog.name) # Output: Buddy print(my_dog.breed) # Output: Golden Retriever my_dog.bark() # Output: Woof!
متدها و پارامتر self
همانطور که قبلاً اشاره شد، پارامتر self در متدها به خود شیء اشاره دارد. این پارامتر به طور خودکار توسط پایتون به متد ارسال میشود و به متد اجازه میدهد تا به ویژگیها و متدهای شیء دسترسی داشته باشد. بدون self، متد نمیتواند به ویژگیهای شیء دسترسی پیدا کند.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
my_rectangle = Rectangle(5, 10)
print(my_rectangle.area()) # Output: 50
print(my_rectangle.perimeter()) # Output: 30
وراثت (Inheritance)
وراثت به ما امکان میدهد تا کلاسهای جدیدی را بر اساس کلاسهای موجود ایجاد کنیم. کلاس جدید (کلاس فرزند) ویژگیها و متدهای کلاس والد (کلاس اصلی) را به ارث میبرد و میتواند ویژگیها و متدهای جدیدی را نیز اضافه کند یا متدهای موجود را بازنویسی کند.
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("Generic animal sound")
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name) # Call the constructor of the parent class
self.breed = breed
def speak(self):
print("Woof!")
class Cat(Animal):
def speak(self):
print("Meow!")
my_dog = Dog("Buddy", "Golden Retriever")
my_cat = Cat("Whiskers")
my_dog.speak() # Output: Woof!
my_cat.speak() # Output: Meow!
print(my_dog.name) # Output: Buddy
در این مثال، کلاس Animal به عنوان کلاس والد تعریف شده است. کلاسهای Dog و Cat از کلاس Animal ارث میبرند. متد speak در کلاسهای Dog و Cat بازنویسی شده است تا صدای خاص هر حیوان را چاپ کند. super().__init__(name) در کلاس Dog، سازنده کلاس والد را فراخوانی میکند تا ویژگی name را مقداردهی کند.
کپسولهسازی (Encapsulation) و ویژگیهای خصوصی
کپسولهسازی به معنای پنهان کردن جزئیات داخلی یک کلاس و ارائه یک رابط کاربری ساده برای دسترسی به آن است. در پایتون، میتوان ویژگیها را به صورت خصوصی با پیشوند دو خط تیره (__) تعریف کرد. ویژگیهای خصوصی فقط از داخل کلاس قابل دسترسی هستند.
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
my_account = BankAccount("1234567890", 1000)
my_account.deposit(500)
my_account.withdraw(200)
print(my_account.get_balance()) # Output: 1300
# print(my_account.__balance) # This will raise an AttributeError
در این مثال، ویژگیهای __account_number و __balance به صورت خصوصی تعریف شدهاند. این ویژگیها فقط از داخل کلاس قابل دسترسی هستند. متدهای deposit، withdraw و get_balance برای دسترسی و تغییر ویژگیهای خصوصی استفاده میشوند.
چندریختی (Polymorphism)
چندریختی به معنای امکان استفاده از یک رابط کاربری برای اشیاء مختلف است. این امر با استفاده از وراثت و بازنویسی متدها امکانپذیر میشود.
مثالی که در بخش وراثت ارائه شد، نمونهای از چندریختی است. متد speak در کلاسهای Animal، Dog و Cat وجود دارد، اما هر کلاس پیادهسازی متفاوتی از این متد ارائه میدهد. بنابراین، میتوان از متد speak برای اشیاء مختلف (Dog و Cat) استفاده کرد و هر شیء صدای خاص خود را چاپ میکند.
نتیجهگیری
کلاسها ابزاری قدرتمند برای سازماندهی کد و ایجاد ساختارهای دادهای پیچیده در پایتون هستند. با استفاده از کلاسها، میتوان برنامههایی را ایجاد کرد که خواناتر، قابل نگهداریتر و قابل توسعهتر هستند. درک مفاهیم اساسی برنامهنویسی شیءگرا و نحوه استفاده از کلاسها در پایتون برای هر برنامهنویس پایتون ضروری است.

بدون دیدگاه