در زبان برنامهنویسی پایتون، برای ایجاد شیء (Object) یا موجودیت (Entity)، از کلاسها (Class) استفاده میشود. کلاس، یک قالب برای تولید شیء است و شیءها دارای ویژگیها (Attributes) و رفتارها (Behaviors) میباشند.
برای تعریف یک کلاس در پایتون، از کلیدواژه class استفاده میشود. سینتکس کلی تعریف یک کلاس به صورت زیر است:
class ClassName:
# attributes
# methods
در اینجا، ClassName نام کلاس است. اجرای دستور بالا به تنهایی هیچ کاری نمیکند، بلکه برای ایجاد شیء از این کلاس باید آن را فراخوانی کنید.
حال بیایید یک کلاس ساده را تعریف کنیم. برای مثال، یک کلاس Student که دارای ویژگیهای name و age باشد و یک متد print_info برای چاپ اطلاعات دانشجو باشد
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self):
print(“Name:”, self.name)
print(“Age:”, self.age)
در اینجا، دو ویژگی name و age به کمک متد constructor ( init ) به کلاس اضافه شدهاند. این متد در زمان ایجاد شیء فراخوانی میشود و ویژگیهای مورد نیاز به عنوان پارامترهای ورودی به آن ارسال میشوند. همچنین، متد print_info برای چاپ اطلاعات دانشجو تعریف شده است.
حال میتوانیم یک شیء از کلاس Student بسازیم و از ویژگیها و متدهای آن استفاده کنیم. به طور مثال
student1 = Student(“Ali”, 20)
student1.print_info()
این کد، یک شیء از کلاس Student به نام student1 ایجاد میکند که دارای ویژگیهای name=”Ali” و age=20 است. سپس، متد print_info براین کد، یک شیء از کلاس Student به نام student1 ایجاد میکند که دارای ویژگیهای name=”Ali” و age=20 است. سپس، متد print_info برای این شیء فراخوانی میشود و اطلاعات دانشجو به صورت زیر چاپ میشود:
Name: Ali
Age: 20
همچنین، میتوانیم ویژگیهای یک شیء را نیز به صورت مستقیم تغییر دهیم. به طور مثال:
student1.age = 21
student1.print_info()
این کد، ویژگی age شیء student1 را به ۲۱ تغییر میدهد و سپس متد print_info را برای نمایش اطلاعات دانشجو فراخوانی میکند. خروجی این کد به شکل زیر خواهد بود:
Name: Ali
Age: 21
در اینجا، ویژگی age شیء student1 به ۲۱ تغییر کرده است و این تغییر در هنگام فراخوانی متد print_info نیز نمایش داده میشود.
در پایتون، متدها (Methods) نیز مانند ویژگیها در داخل کلاس تعریف میشوند. متدها همانند توابع (Functions) هستند، با این تفاوت که هرگاه یک متد را برای یک شیء فراخوانی کنید، خود شیء به صورت پنهان به عنوان پارامتر اول به متد ارسال میشود. این پارامتر را با نام self شناخته میشود و برای دسترسی به ویژگیهای شیء درون متد استفاده میشود.
در مثال Student، متد print_info از self برای دسترسی به ویژگیهای name و age استفاده میکند. در صورتی که به جای self، پارامتر دیگری قرار داده شود، متد به درستی کار نخواهد کرد.
در کلاس Student، ما از متد constructor ( init ) برای تعریف ویژگیهای کلاس استفاده کردیم. متد constructor هنگامی که یک شیء از کلاس ساخته میشود، به صورت خودکار فراخوانی میشود و ویژگیهای کلاس را مقداردهی اولیه میکند.
به طور کلی، تعریف یک کلاس در پایتون به شکل زیر است:
class ClassName:
def __init__(self, arg1, arg2, …):
# Constructor
# Define attributes of the class here
def method1(self, arg1, arg2, …):
# Method 1
def method2(self, arg1, arg2, …):
# Method 2
# More methods can be defined here
در این قالب، ما تمامی ویژگیها و متدهای کلاس را درون بلوک کلاس تعریف میکنیم. متد constructor همیشه با نام init تعریف میشود و ویژگیهای کلاس درون آن تعریف میشوند. در مثال Student، ویژگیهای name و age در constructor تعریف شدهاند.
متدهای دیگر کلاس را نیز میتوان به شکل رفتارهای دیگری که شیء از کلاس میتواند داشته باشد، تعریف کرد. در مثال Student، ما متد print_info را تعریف کردیم که اطلاعات دانشجو را چاپ میکند.
به طور خلاصه، کلاسها و شیءها در پایتون برای ساختاردهی به کد و تعریف انواع مختلف دادهها و رفتارهای آنها استفاده میشوند. با تعریف کلاس و سپس ساخت شیء از آن، ما میتوانیم به راحتی با دادهها و رفتارهای آنها در کدمان کار کنیم. همچنین، با استفاده از ویژگیها و متدهای کلاس، ما میتوانیم رفتار و دادههای یک شیء را به راحتی تغییر دهیم و کنترل کنیم.
یکی از مزایای استفاده از کلاسها و شیءها در پایتون این است که ما میتوانیم به راحتی و با استفاده از ارثبری، کلاسها را گسترش دهیم. ارثبری به معنای مشتق شدن یک کلاس از یک کلاس دیگر است. با ارثبری، ما میتوانیم ویژگیها و رفتارهای یک کلاس را به یک کلاس دیگر اضافه کنیم و یا آنها را بازنویسی کنیم.
به طور کلی، تعریف یک کلاس مشتق شده از یک کلاس پدر به شکل زیر است:
class ChildClassName(ParentClassName):
def __init__(self, arg1, arg2, …):
super().__init__(arg1, arg2, …)
# Define additional attributes of the child class here
def method1(self, arg1, arg2, …):
# Override parent method 1 or define a new method
def method2(self, arg1, arg2, …):
# Override parent method 2 or define a new method
# More methods can be defined here
در این قالب، با استفاده از نام کلاس پدر درون پرانتز کلاس مشتق شده، ما آن را از کلاس پدر مشتق کردهایم. در constructor کلاس مشتق شده، ما ابتدا با استفاده از super().init() constructor کلاس پدر را فراخوانی میکنیم و سپس ویژگیهای جدید کلاس مشتق شده را تعریف میکنیم. سپس ما متدهای کلاس پدر را بازنویسی یا تعریف متدهای جدید را انجام میدهیم.
به عنوان مثال، میتوانیم یک کلاس Teacher را از کلاس Person بسازیم. به این صورت که Teacher از Person مشتق شدهاست و برای Teacher، ویژگی salary و متد print_info را تعریف کردهایم.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def print_info(self):
print(f”Name: {self.name}, Age: {self.age}”)
class Teacher(Person):
def __init__(self, name, age, salary):
super().__init__(name, age)
self.salary = salary
def print_info(self):
super().