در این مقاله از مجموعه آموزشهای پی استور، میخواهیم بررسی کنیم که کلاس در برنامه نویسی چیست و چرا مهم است. کلاسها در برنامهنویسی شیگرا ابزاری قدرتمند برای نوشتن نرمافزارهای پیچیده و مقیاسپذیر هستند.
تعریف شی گرایی یا OOP
شیگرایی (Object-Oriented Programming یا به اختصار OOP) یک الگوی برنامهنویسی است که بر اساس مفاهیم اشیاء و کلاسها استوار است. در این الگو، دادهها و رفتارها به صورت یکجا در قالب کلاسها و اشیاء سازماندهی میشوند. در برنامهنویسی شیگرا، هر شیء میتواند ویژگیهای خاص خود (که معمولاً به نام خصوصیات یا Attributes شناخته میشوند) و متدها (که رفتارها یا عملکردها را تعریف میکنند) داشته باشد.
در شیگرایی، برنامهها به جای پردازش دادهها به صورت توالیای از دستورات، به مجموعهای از اشیاء تقسیم میشوند که با یکدیگر تعامل دارند. هر شیء از یک کلاس ساخته میشود، که در واقع یک الگو (template) برای ساخت اشیاء است و هدف آن ایجاد برنامههایی با ساختار منظم، قابل نگهداری و مقیاسپذیر است.
اصول اولیه شیگرایی
درک و استفاده از اصول پایهای شیگرایی، مانند کلاسها، اشیاء، ویژگیها (Attributes)، متدها (Methods) و سازندهها (Constructors)، امکان ساخت نرمافزارهای پیچیده و بزرگتر را با مدیریت بهینه منابع فراهم میآورد. این اصول به برنامهنویسان کمک میکنند تا کدهایی خوانا، قابل استفاده مجدد و آسان برای توسعه بنویسند. در ادامه به معرفی این اصول و نحوه استفاده از آنها میپردازیم.
کلاس (Class)
کلاس در برنامه نویسی چیست؟ کلاسها اساس شیگرایی هستند و به عنوان الگوهایی برای ایجاد اشیاء عمل میکنند. هر کلاس ویژگیها و رفتارهای خاصی را تعریف میکند که اشیاء ساخته شده از آن کلاس میتوانند داشته باشند. به عبارتی، کلاسها مانند نقشه یا طرحی هستند که مشخص میکنند اشیاء باید چه ویژگیها و متدهایی داشته باشند.
شیء (Object)
شیء نمونهای از یک کلاس است که ویژگیها و متدهای آن کلاس را به ارث میبرد. وقتی یک کلاس تعریف میشود، از آن میتوان چندین شیء مختلف ایجاد کرد که هر یک میتواند ویژگیهای خاص خود را داشته باشد.
ویژگی (Attribute)
ویژگیها، که به آنها متغیرهای کلاس یا فیلدها هم گفته میشود، دادههایی هستند که به اشیاء مربوط به کلاسها اختصاص مییابند. هر ویژگی نمایانگر یک خاصیت یا صفت از شیء است. ویژگیها معمولاً در سازنده تعریف شده و هنگام ساخت شیء مقداردهی میشوند.
توابع یا متدها (Methods)
متدها توابعی هستند که رفتارهای یک کلاس را تعریف میکنند. این متدها عملیاتی را روی ویژگیها انجام داده و یا عملیات خاصی را برای شیء انجام میدهند. متدها میتوانند ورودیها را دریافت کرده و خروجیهای خاصی را تولید کنند.
سازنده (Constructor)
سازندهها متدهای ویژهای هستند که هنگام ایجاد یک شیء از کلاس فراخوانی میشوند. هدف اصلی سازندهها مقداردهی اولیه به ویژگیهای شیء است. در بسیاری از زبانها، سازندهها به همان نام کلاس نامگذاری میشوند و میتوانند پارامترهایی را دریافت کرده و ویژگیهای شیء را تنظیم کنند.
مثال شی گرایی
در زیر مثال شخص به زبان پایتون آورده شده است:
class Person: # سازنده (Constructor) def __init__(self, name, age): self.name = name # ویژگی name self.age = age # ویژگی age # متد greet def greet(self): print(f"Hello, my name is {self.name} and I am {self.age} years old.") # متد have_birthday def have_birthday(self): self.age += 1 print(f"Happy Birthday {self.name}! You are now {self.age} years old.") # ایجاد شیء از کلاس Person person1 = Person("Alice", 30) person2 = Person("Bob", 25) # فراخوانی متد greet برای هر شخص person1.greet() # Output: Hello, my name is Alice and I am 30 years old. person2.greet() # Output: Hello, my name is Bob and I am 25 years old. # فراخوانی متد have_birthday برای person1 person1.have_birthday() # Output: Happy Birthday Alice! You are now 31 years old.
توضیح کد
در ادامه به توضیح هر بخش خواهیم پرداخت:
- کلاس (Class):
کلاس Person
یک قالب برای ایجاد اشیاء است که ویژگیها و متدهای مختلفی دارد. این کلاس نمایانگر یک شخص با ویژگیهای خاصی مانند name
و age
است.
- شیء (Object):
در این مثال، person1
و person2
دو شیء از کلاس Person
هستند. هر شیء از این کلاس ویژگیهای خاص خود را دارد که هنگام ساخت شیء مقداردهی میشود. person1
نام “Alice” و سن ۳۰ سال دارد، و person2
نام “Bob” و سن ۲۵ سال دارد.
- ویژگی (Attribute):
در این مثال، name
(نام) و age
(سن) ویژگیهایی هستند که به هر شیء از کلاس Person
تعلق دارند.
- متد (Method):
متد greet
در اینجا برای چاپ یک پیام خوشآمدگویی استفاده میشود که نام و سن شخص را نشان میدهد. متد have_birthday
برای افزایش سن شخص و چاپ پیام تبریک تولد استفاده میشود.
- سازنده (Constructor):
در این مثال، سازنده __init__
برای کلاس Person
طراحی شده است و وقتی شیء جدیدی از این کلاس ایجاد میشود، به طور خودکار ویژگیهای name
و age
را مقداردهی میکند.
توضیحات برنامه
ابتدا دو شیء از کلاس Person
به نامهای person1
و person2
با استفاده از سازنده __init__
ساخته میشوند. برای هرکدام از این اشیاء، ویژگیهای name
و age
مقداردهی میشود.
سپس، متد greet
برای هرکدام از این اشیاء فراخوانی میشود تا پیام خوشآمدگویی با استفاده از ویژگیهای name
و age
چاپ شود. در نهایت، متد have_birthday
برای person1
فراخوانی میشود تا سن او یک واحد افزایش یابد و پیام تبریک تولد چاپ شود.
۴ اصل اصلی شیگرایی
چهار اصل اصلی شیگرایی شامل کپسولهسازی، وراثت، پولیمورفیسم و انتزاع هستند که به طراحی سیستمهای نرمافزاری کمک میکنند تا انعطافپذیرتر، قابل نگهداریتر و قابل گسترشتر باشند. این اصول با کاهش پیچیدگی و افزایش بهرهوری، نرمافزارها را سازماندهی شده و امن میکنند. در ادامه مقاله کلاس در برنامه نویسی چیست به توضیح این موارد میپردازیم.
کپسولهسازی (Encapsulation)
کپسولهسازی به معنی پنهان کردن جزئیات داخلی یک شیء و تنها در دسترس قرار دادن رابطهایی است که از طریق آنها میتوان به دادهها و متدهای آن شیء دسترسی پیدا کرد. این امر موجب حفاظت از دادهها در برابر دسترسی غیرمجاز و تغییرات ناخواسته میشود. به عبارت دیگر، دادهها و متدها در داخل یک کلاس بسته میشوند، و دسترسی به دادهها از طریق متدهای عمومی (مانند getter و setter) صورت میگیرد.
انتزاع (Abstraction)
انتزاع به معنی پنهان کردن جزئیات پیچیده و نمایش فقط جنبههای ضروری و مهم به کاربر است. این فرآیند باعث سادهسازی طراحی سیستمها و کاهش پیچیدگی میشود. در شیگرایی، این امر معمولاً از طریق کلاسها و اینترفیسها (Interfaces) انجام میشود. انتزاع به کاربران اجازه میدهد تنها به بخشهایی از سیستم توجه کنند که برای آنها مهم است، بدون اینکه نیازی به نگرانی در مورد پیادهسازی داخلی وجود داشته باشد.
وراثت (Inheritance)
وراثت فرآیندی است که به وسیله آن یک کلاس جدید میتواند ویژگیها و رفتارهای (متدها) یک کلاس موجود را به ارث ببرد. این ویژگی به برنامهنویس این امکان را میدهد که کلاسهای جدید را با استفاده از کلاسهای پایه یا والد ایجاد کند و در نتیجه کد را بهصورت مؤثرتری سازماندهی کند. وراثت باعث اشتراکگذاری کدها و کاهش تکرار آنها میشود.
چندریختی یا پلی مورفیسم (Polymorphism)
پلی مورفیسم به معنای “چندشکلی” است و به قابلیت اشیاء از کلاسهای مختلف برای پاسخگویی به یک دستور مشابه، ولی با رفتار متفاوت اشاره دارد. این ویژگی باعث میشود که کد انعطافپذیرتر و قابل گسترشتر باشد. پولیمورفیسم به دو نوع تقسیم میشود:
- پلی مورفیسم زمان کامپایل (Compile-time Polymorphism): مانند overloading که در آن میتوان متدها یا اپراتورها را با امضاهای مختلف تعریف کرد.
- پلی مورفیسم زمان اجرا (Runtime Polymorphism): مانند overriding که در آن یک متد از کلاس فرزند میتواند رفتار متد مشابه از کلاس والد را تغییر دهد.
کلاس در برنامه نویسی چیست؟
کلاسها در برنامهنویسی شیگرا پایه و اساس ساختار نرمافزار هستند و سایر مفاهیم شیگرایی مانند اشیاء، وراثت، انکپسولیشن، پلیمورفیسم و انتقال دادهها درون آنها به کار میروند. این اجزا با یکدیگر ارتباط نزدیکی دارند و کمک میکنند تا کدها خواناتر، مقیاسپذیرتر و قابل نگهداریتر شوند.
ساختار یک کلاس
هر کلاس از دو جزء اصلی تشکیل میشود:
- متغیرها (Attributes)
- توابع (Methods)
متغیرها یا ویژگیهای یک کلاس، مشخصکننده دادهها یا اطلاعاتی هستند که شیء از کلاس در اختیار دارد. این متغیرها اطلاعاتی هستند که در طول عمر شیء ذخیره میشوند و میتوانند مقادیر مختلفی در هر شیء از همان کلاس داشته باشند. در واقع، متغیرهای کلاس همان فیلدها یا خصوصیات (Properties) شیء هستند.
توابع یا متدها در یک کلاس، رفتارهای شیء را تعریف میکنند. این توابع معمولاً بر روی دادهها (متغیرها) عمل میکنند و میتوانند تغییراتی در آنها ایجاد کنند یا خروجیهایی را تولید نمایند. هر متد معمولاً برای انجام عملیاتی خاص برای شیء کلاس طراحی میشود.
نحوه تعریف کلاس در زبان پایتون
در ادامه مقاله کلاس در برنامه نویسی چیست میخواهیم نحوه تعریف کلاس را بررسی کنیم. در زبان پایتون، کلاسها با استفاده از کلمه کلیدی class
تعریف میشوند. یک کلاس معمولاً شامل یک یا چند سازنده (constructor) و متدها (توابع) است که رفتارهای مختلف را برای اشیاء کلاس مشخص میکند. در پایتون، برای ساخت یک شیء از کلاس، از سازنده __init__
استفاده میشود که مانند یک سازنده در زبانهای دیگر عمل میکند.
برای تعریف یک کلاس در پایتون، مراحل زیر را باید دنبال کنید:
- تعریف کلمه کلیدی class: کلمه
class
برای معرفی کلاس استفاده میشود. - تعریف سازنده (constructor): سازنده کلاس در پایتون با نام
__init__
تعریف میشود. این متد به هنگام ایجاد شیء جدید از کلاس فراخوانی میشود. - تعریف متغیرها و توابع (Attributes and Methods): شما میتوانید ویژگیها (متغیرها) و رفتارهای (توابع) مختلف را در داخل کلاس تعریف کنید.
class ClassName: def __init__(self, param1, param2): # این سازنده برای ایجاد شیء و مقداردهی اولیه متغیرها است self.param1 = param1 self.param2 = param2 def method_name(self): # این متد برای انجام عملیات بر روی دادهها یا ویژگیهای شیء استفاده میشود print(f"Value of param1: {self.param1}") print(f"Value of param2: {self.param2}")
نحوه ایجاد شیء از کلاس و فراخوانی متدها
برای ایجاد شیء از یک کلاس در پایتون و فراخوانی متدها، ابتدا باید یک شیء (یا نمونه) از کلاس بسازید و سپس از آن شیء برای دسترسی به ویژگیها و متدهای کلاس استفاده کنید. این فرآیند به طور کلی شامل دو مرحله است:
۱. ایجاد شیء از کلاس
برای ایجاد یک شیء از کلاس، باید کلاس مورد نظر را به همراه پارامترهای لازم برای سازنده __init__
فراخوانی کنید. سازنده بهطور خودکار هنگام ایجاد شیء اجرا میشود و مقادیر اولیه را به ویژگیهای کلاس اختصاص میدهد.
۲. فراخوانی متدها
پس از ایجاد شیء، میتوانید متدهای آن کلاس را از طریق شیء ایجاد شده فراخوانی کنید. این کار با استفاده از عملگر نقطه (.
) انجام میشود.
- مثال:
در اینجا یک مثال ساده از نحوه ایجاد شیء از یک کلاس و فراخوانی متدهای آن در پایتون آورده شده است. این مثال یک کلاس به نام Dog را تعریف میکند که ویژگیهای مربوط به سگ و متدهایی برای انجام عملیاتهایی مثل پارس کردن و خوردن غذا دارد. برای دانستن اینکه کلاس در برنامه نویسی چیست ابتدا باید کلاس را تعریف کنیم:
class Dog: def __init__(self, name, age): self.name = name # نام سگ self.age = age # سن سگ def bark(self): print(f"{self.name} is barking!") def eat(self, food): print(f"{self.name} is eating {food}.")
در این مثال __init__
سازنده کلاس است که هنگام ایجاد شیء جدید فراخوانی میشود و نام و سن سگ را به ویژگیهای name
و age
اختصاص میدهد؛bark
متدی است که چاپ میکند سگ در حال پارس کردن است؛ وeat
متدی است که چاپ میکند سگ در حال خوردن غذایی خاص است.
حالا در ادامه میتوانیم یک شیء از این کلاس بسازیم و متدهای آن را فراخوانی کنیم.
- مثال:
# ایجاد شیء جدید از کلاس Dog my_dog = Dog("Buddy", 3) # فراخوانی متد bark برای پارس کردن سگ my_dog.bark() # فراخوانی متد eat برای خوردن غذا my_dog.eat("bone")
در ابتدا یک شیء جدید از کلاس Dog
به نام my_dog
ساختهایم و نام آن را “Buddy” و سن آن را ۳ سال قرار دادهایم. سپس متد bark()
را فراخوانی کردیم تا نمایش دهد که سگ پارس میکند. در نهایت، متد eat()
را فراخوانی کردیم و به آن یک پارامتر "bone"
(استخوان) دادیم تا نشان دهیم که سگ در حال خوردن استخوان است.
- خروجی برنامه به صورت زیر است:
Buddy is barking! Buddy is eating bone.
مزایای استفاده از کلاسها
حال که دانستیم کلاس در برنامه نویسی چیست چیست بیایید به مزایای استفاده از آنها اشاره کنیم. استفاده از کلاسها در برنامهنویسی شیگرا مزایای زیادی دارد که به بهبود کیفیت و ساختار کد کمک میکند. سه مزیت اصلی استفاده از کلاسها عبارتند از:
۱. افزایش قابلیت نگهداری
کلاسها باعث میشوند کد به بخشهای کوچکتر و قابل مدیریتتر تقسیم شود. هر کلاس مسئول یک بخش خاص از برنامه است و این جدا شدن وظایف باعث میشود تغییرات در یک قسمت از کد، تأثیر کمی بر سایر قسمتها داشته باشد. همچنین، با استفاده از متدها و ویژگیهای کلاسها، میتوان کدهای تکراری را کاهش داد و نگهداری آنها آسانتر میشود.
۲. بهبود خوانایی کد
کلاسها خوانایی کد را بهبود میدهند زیرا کد به بخشهای مستقلی تقسیم میشود که هر بخش وظیفه خاصی را انجام میدهد. نامگذاری مناسب کلاسها و متدها کمک میکند تا وظایف و عملکردهای سیستم بهراحتی قابل درک باشند. این باعث میشود دیگر برنامهنویسان و خود فرد توسعهدهنده بهراحتی بتوانند کد را بخوانند و درک کنند.
۳. کاهش پیچیدگی سیستم
کلاسها با استفاده از تجرید، جزئیات پیچیده را پنهان میکنند و فقط ویژگیها و رفتارهای مهم را نشان میدهند، که این امر پیچیدگی سیستم را کاهش میدهد. همچنین، افزودن ویژگیهای جدید یا تغییرات در سیستم بهراحتی امکانپذیر است و این باعث میشود که سیستم گسترشپذیر و انعطافپذیر باشد. کاهش وابستگیها میان بخشهای مختلف برنامه نیز به کاهش پیچیدگی کمک میکند.
در نتیجه، استفاده از کلاسها موجب افزایش قابلیت نگهداری، بهبود خوانایی کد و کاهش پیچیدگی سیستم میشود، که به توسعهدهندگان کمک میکند کدهای تمیز، منظم و قابل گسترش بنویسند.
نتیجه گیری
در این مقاله دانستیم که کلاس در برنامه نویسی چیست. به طور خلاصه، کلاسها در برنامهنویسی شیگرا ابزارهای قدرتمندی برای ساختاردهی به کد، بهبود خوانایی، و کاهش پیچیدگی سیستمها هستند. با تقسیم وظایف به بخشهای مستقل، افزایش قابلیت نگهداری کد، و استفاده از متدها برای کاهش تکرار، کلاسها به توسعهدهندگان این امکان را میدهند که کدهای خود را بهصورت سازماندهیشده و مقیاسپذیر بنویسند. همچنین، از آنجا که کلاسها جزئیات پیچیده را پنهان میکنند و به راحتی قابل گسترش هستند، به کاهش پیچیدگی سیستم و تسهیل تغییرات و افزودن ویژگیهای جدید کمک میکنند.