کلاس و شیء در پایتون (Object-Oriented Programming)

تا اینجا با متغیرها، شرط‌ها، حلقه‌ها، توابع و ساختارهای داده در پایتون آشنا شدیم. اما زمانی که برنامه‌ها بزرگ‌تر و پیچیده‌تر می‌شوند، نوشتن کد به روش معمول دشوار خواهد شد. در چنین شرایطی، برنامه‌نویسی شیءگرا (Object-Oriented Programming یا OOP) به ما کمک می‌کند کدهای خود را منظم‌تر، قابل نگهداری‌تر و قابل استفاده مجدد بنویسیم.

در برنامه‌نویسی شیءگرا، به جای اینکه فقط روی توابع تمرکز کنیم، برنامه را به مجموعه‌ای از اشیاء (Objects) تقسیم می‌کنیم. هر شیء دارای ویژگی‌ها (اطلاعات) و رفتارها (عملیات) است. این روش امروزه یکی از مهم‌ترین شیوه‌های برنامه‌نویسی در زبان‌هایی مانند Python، Java و C# محسوب می‌شود.

در این آموزش یاد می‌گیریم چگونه کلاس بسازیم، از روی آن شیء ایجاد کنیم و برای هر شیء ویژگی‌ها و متدهای مخصوص به خود را تعریف کنیم.

فهرست مطالب

برنامه‌نویسی شیءگرا (OOP) چیست؟

فرض کنید می‌خواهیم اطلاعات چند دانش‌آموز را در برنامه ذخیره کنیم. اگر برای هر دانش‌آموز چندین متغیر جداگانه تعریف کنیم، برنامه خیلی سریع شلوغ و مدیریت آن سخت می‌شود. راه بهتر این است که یک الگو برای دانش‌آموز تعریف کنیم و سپس هر دانش‌آموز را بر اساس همان الگو بسازیم. به این الگو کلاس (Class) می‌گوییم و هر نمونه‌ای که از آن ساخته می‌شود یک شیء (Object) نام دارد.

به بیان ساده:

  • کلاس مانند یک نقشه یا قالب است.
  • شیء نمونه‌ای واقعی است که از روی آن قالب ساخته می‌شود.

یک مثال از دنیای واقعی

فرض کنید کارخانه‌ای خودرو تولید می‌کند. در این کارخانه نقشه ساخت خودرو همان کلاس (Class) است و هر خودروی تولیدشده  شیء (Object) از آن کلاس؛ تمام خودروها از یک نقشه ساخته می‌شوند، اما هر کدام می‌توانند رنگ، مدل یا شماره پلاک متفاوتی داشته باشند. همین ایده در برنامه‌نویسی نیز استفاده می‌شود.

تعریف اولین کلاس در پایتون

در پایتون برای ایجاد یک کلاس از کلمه کلیدی class استفاده می‌کنیم. ساده‌ترین شکل تعریف یک کلاس به صورت زیر است:

class Student:
    pass

در این مثال:

  • class کلمه کلیدی برای ایجاد کلاس است.
  • Student نام کلاس است.
  • pass یعنی فعلاً داخل کلاس هیچ دستوری وجود ندارد.

در حال حاضر فقط یک قالب (Template) ساخته‌ایم و هنوز هیچ شیئی از آن ایجاد نشده است.

ایجاد اولین شیء (Object)

برای ساخت یک شیء، کافی است نام کلاس را مانند یک تابع صدا بزنیم.

class Student:
    pass

student1 = Student()

در این برنامه ابتدا کلاس Student ساخته شده است. سپس یک شیء به نام student1 از روی این کلاس ایجاد شده است. در این لحظه، متغیر student1 یک شیء از نوع Student است.

ساخت چند شیء از یک کلاس

یکی از مهم‌ترین مزیت‌های کلاس این است که می‌توان از روی یک کلاس، هر تعداد شیء که بخواهیم ایجاد کنیم.

class Student:
    pass

student1 = Student()
student2 = Student()
student3 = Student()

اکنون سه شیء مختلف از یک کلاس ساخته شده‌اند. هر سه از روی یک الگو ایجاد شده‌اند، اما بعداً می‌توانند اطلاعات متفاوتی داشته باشند.

کلاس را مانند قالب شیرینی تصور کنید!

فرض کنید یک قالب شیرینی قلبی‌شکل دارید. در این صورت قالب شیرینی همان کلاس است و هر شیرینی که با آن قالب درست می‌شود، معادل یک شی از آن کلاس است. شما با یک قالب می‌توانید صدها شیرینی درست کنید. همه شکل مشابهی دارند، اما می‌توانند رنگ، طعم یا تزئینات متفاوتی داشته باشند.

مثال

فرض کنید کلاس Car را تعریف کنیم.

class Car:
    pass

حالا چند خودرو می‌سازیم.

class Car:
    pass

car1 = Car()
car2 = Car()
car3 = Car()

اکنون سه شیء از کلاس Car ساخته شده است. در حال حاضر این خودروها هیچ اطلاعاتی ندارند؛ نه رنگ، نه مدل و نه سرعت. در بخش بعدی یاد می‌گیریم چگونه برای هر شیء ویژگی‌هایی مانند رنگ، مدل و سال ساخت تعریف کنیم.

ویژگی (Attribute) چیست؟

تا اینجا توانستیم از روی یک کلاس چند شیء ایجاد کنیم، اما این اشیاء هنوز هیچ اطلاعاتی ندارند. برای مثال اگر بخواهیم اطلاعات یک دانش‌آموز را ذخیره کنیم، به مواردی مانند نام، سن و معدل نیاز داریم. این اطلاعات را ویژگی (Attribute) می‌نامند. به عبارت دیگر، ویژگی‌ها همان متغیرهایی هستند که متعلق به یک شیء هستند.

برای مثال، اگر کلاس Student داشته باشیم، ویژگی‌های آن می‌توانند شامل موارد زیر باشند:

  • نام
  • سن
  • معدل

و اگر کلاس Car داشته باشیم، ویژگی‌های آن می‌توانند شامل موارد زیر باشند:

  • رنگ
  • مدل
  • سال ساخت

افزودن ویژگی به یک شیء

می‌توان بعد از ساخت شیء، ویژگی‌های آن را تعریف کرد.

class Student:
    pass

student1 = Student()

student1.name = "Ali"
student1.age = 18
student1.score = 19.5

print(student1.name)
print(student1.age)
print(student1.score)

خروجی

Ali
18
19.5

در این مثال، سه ویژگی به شیء student1 اضافه شده است.

 

ساخت چند شیء

هر شیء می‌تواند مقادیر مخصوص به خودش را داشته باشد.

class Student:
    pass

student1 = Student()
student2 = Student()

student1.name = "Ali"
student1.age = 18

student2.name = "Sara"
student2.age = 20

print(student1.name)
print(student2.name)

خروجی

Ali
Sara

با اینکه هر دو از یک کلاس ساخته شده‌اند، اما اطلاعات کاملاً متفاوتی دارند.

به این نکته توجه کنید:

این روش برای مثال‌های ساده قابل استفاده است، اما اگر فراموش کنیم یکی از ویژگی‌ها را برای یک شیء تعریف کنیم، برنامه با خطا مواجه می‌شود.

بنابراین بهتر است هنگام ساخت هر شیء، تمام ویژگی‌های موردنیاز را به صورت خودکار مقداردهی کنیم. برای انجام این کار از متد سازنده (__init__) استفاده می‌کنیم.

متد __init__ چیست؟

متد __init__ یک متد ویژه در پایتون است که به محض ایجاد یک شیء، به‌طور خودکار اجرا می‌شود. از این متد برای مقداردهی اولیه ویژگی‌های شیء استفاده می‌کنیم. ساختار کلی آن به صورت زیر است:

class Student:

    def __init__(self):
        print("Object Created")

اگر اکنون یک شیء ایجاد کنیم:

student1 = Student()

خروجی

Object Created

بدون اینکه خودمان متد __init__ را فراخوانی کنیم، پایتون آن را به صورت خودکار اجرا می‌کند.

پارامتر self چیست؟

اگر به مثال قبلی دقت کنید، متد __init__ یک پارامتر به نام self داشت.

class Student:

    def __init__(self):
        print("Object Created")

self به شیء جاری (Current Object) اشاره می‌کند؛ یعنی همان شیئی که در حال ساخته شدن یا استفاده شدن است. به کمک self می‌توانیم به ویژگی‌ها و متدهای همان شیء دسترسی داشته باشیم.

نکته: نام self یک قرارداد در پایتون است. از نظر فنی می‌توانید نام دیگری انتخاب کنید، اما تقریباً تمام برنامه‌نویسان از self استفاده می‌کنند و بهتر است شما هم همین کار را انجام دهید.

مقداردهی ویژگی‌ها با self

اکنون می‌توانیم هنگام ساخت هر شیء، ویژگی‌های آن را مقداردهی کنیم.

class Student:

    def __init__(self):
        self.name = "Ali"
        self.age = 18
        self.score = 19.5

student1 = Student()

print(student1.name)
print(student1.age)
print(student1.score)

خروجی

Ali
18
19.5

در این مثال self.name ویژگی نام را ایجاد می‌کند. self.age ویژگی سن را ایجاد می‌کند. و self.score ویژگی معدل را ایجاد می‌کند.

از این به بعد هر شیئی که ساخته شود، این سه ویژگی را خواهد داشت.

این روش یک مشکل دارد

فرض کنید بخواهیم اطلاعات چند دانش‌آموز مختلف را ذخیره کنیم. اگر کد بالا را اجرا کنیم، همه دانش‌آموزان دقیقاً اطلاعات یکسانی خواهند داشت.

student1 = Student()
student2 = Student()

print(student1.name)
print(student2.name)

خروجی

Ali
Ali

مشخص است که این روش مناسب نیست؛ چون هر دانش‌آموز باید اطلاعات مخصوص به خودش را داشته باشد.

ارسال اطلاعات هنگام ساخت شیء

راه‌حل این است که هنگام ایجاد شیء، اطلاعات موردنیاز را به متد __init__ ارسال کنیم.

class Student:

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

student1 = Student("Ali", 18, 19.5)
student2 = Student("Sara", 20, 18.75)

print(student1.name)
print(student2.name)

خروجی

Ali
Sara

در این مثال "Ali" در متغیر name قرار می‌گیرد. عدد 18 در متغیر age قرار می‌گیرد. و عدد 19.5 در متغیر score قرار می‌گیرد. سپس با دستورهای زیر، این مقادیر داخل شیء ذخیره می‌شوند.

self.name = name
self.age = age
self.score = score

در این دستور:

self.name = name

سمت راست (name) مقداری است که هنگام ساخت شیء ارسال کرده‌ایم. سمت چپ (self.name) ویژگی مربوط به همان شیء است. بنابراین این دستور یعنی: «مقدار ورودی name را داخل ویژگی name این شیء ذخیره کن.» همین اتفاق برای age و score نیز رخ می‌دهد.

در نتیجه اکنون هر شیء اطلاعات مخصوص به خودش را دارد.

student1 = Student("Ali", 18, 19.5)
student2 = Student("Sara", 20, 18.75)
student3 = Student("Reza", 17, 17.25)

هر سه شیء از یک کلاس ساخته شده‌اند، اما هر کدام نام، سن و معدل متفاوتی دارند.

متد (Method) چیست؟

تا اینجا ویژگی‌های یک شیء را تعریف کردیم؛ مانند نام، سن و معدل. اما یک شیء علاوه بر اطلاعات، می‌تواند رفتار (Behavior) نیز داشته باشد. در برنامه‌نویسی شیءگرا، به توابعی که داخل یک کلاس تعریف می‌شوند متد (Method) می‌گویند. به بیان ساده:

  • ویژگی (Attribute) اطلاعات یک شیء را نگهداری می‌کند.
  • متد (Method) عملی را روی آن اطلاعات انجام می‌دهد.

در مثال زیر یک متد به نام show_info تعریف می‌کنیم که اطلاعات دانش‌آموز را نمایش می‌دهد.

class Student:

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def show_info(self):
        print("Name:", self.name)
        print("Age:", self.age)
        print("Score:", self.score)


student1 = Student("Ali", 18, 19.5)

student1.show_info()

خروجی

Name: Ali
Age: 18
Score: 19.5
 

متد چگونه اجرا می‌شود؟

برای اجرای یک متد، از نام شیء و سپس نام متد استفاده می‌کنیم.

student1.show_info()

پایتون به صورت خودکار، شیء student1 را به عنوان self به متد ارسال می‌کند. به همین دلیل هنگام فراخوانی متد، لازم نیست خودمان self را بنویسیم.

 

ساخت چند شیء

همان متد برای تمام اشیاء قابل استفاده است.

class Student:

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def show_info(self):
        print(self.name, self.age, self.score)


student1 = Student("Ali", 18, 19.5)
student2 = Student("Sara", 20, 18.75)

student1.show_info()
student2.show_info()

خروجی

Ali 18 19.5
Sara 20 18.75

دقت کنید که کد متد فقط یک بار نوشته شده است، اما برای هر تعداد شیء می‌توان از آن استفاده کرد.

 

متد می‌تواند مقدار برگرداند

همانند توابع، متدها نیز می‌توانند از return استفاده کنند.

class Rectangle:

    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height


rect = Rectangle(5, 8)

print(rect.area())

خروجی

40

در این مثال، متد area مساحت مستطیل را محاسبه کرده و مقدار آن را برمی‌گرداند.

تفاوت تابع و متد

تابع (Function) متد (Method)
خارج از کلاس تعریف می‌شود. داخل کلاس تعریف می‌شود.
مستقل است. به یک کلاس و شیء تعلق دارد.
معمولاً با نام تابع فراخوانی می‌شود. از طریق یک شیء فراخوانی می‌شود.
به self نیاز ندارد. معمولاً اولین پارامتر آن self است.

✏️ تمرین 1: ساخت کلاس دانش‌آموز

یک کلاس به نام Student ایجاد کنید که اطلاعات یک دانش‌آموز را ذخیره کند.

کلاس باید شامل ویژگی‌های زیر باشد:

  • نام دانش‌آموز (name)
  • سن (age)
  • معدل (score)

یک متد به نام show_info() ایجاد کنید که اطلاعات دانش‌آموز را نمایش دهد.

سپس دو شیء از این کلاس بسازید و اطلاعات آن‌ها را نمایش دهید.

✏️ تمرین 2: مدیریت کتابخانه

یک کلاس به نام Book ایجاد کنید که اطلاعات یک کتاب را نگهداری کند.

ویژگی‌های کلاس:

  • عنوان کتاب (title)
  • نام نویسنده (author)
  • سال انتشار (year)

یک متد به نام display() بنویسید که اطلاعات کتاب را چاپ کند.

سه کتاب مختلف ایجاد کنید و اطلاعات آن‌ها را نمایش دهید.

✏️ تمرین 3: سیستم فروشگاه

یک کلاس به نام Product برای محصولات یک فروشگاه ایجاد کنید.

ویژگی‌های کلاس:

  • نام محصول (name)
  • قیمت (price)
  • تعداد موجودی (stock)

متدی به نام show_product() بنویسید که اطلاعات محصول را نمایش دهد.

سپس چند محصول ایجاد کنید و اطلاعات آن‌ها را چاپ کنید.

✏️ تمرین 4: سیستم حساب بانکی

یک کلاس به نام BankAccount ایجاد کنید.

ویژگی‌های کلاس:

  • نام صاحب حساب (owner)
  • موجودی حساب (balance)

متدهای زیر را ایجاد کنید:

  • deposit() برای اضافه کردن پول به حساب
  • withdraw() برای برداشت پول از حساب
  • show_balance() برای نمایش موجودی

دو حساب مختلف ایجاد کنید و چند عملیات واریز و برداشت روی آن‌ها انجام دهید.

✏️ تمرین 5: مدیریت خودرو

یک کلاس به نام Car طراحی کنید.

ویژگی‌های کلاس:

  • برند خودرو (brand)
  • مدل خودرو (model)
  • سرعت فعلی (speed)

دو متد ایجاد کنید:

  • increase_speed() برای افزایش سرعت
  • show_status() برای نمایش اطلاعات خودرو

چند خودرو بسازید و سرعت آن‌ها را تغییر دهید.

وراثت در پایتون و مفاهیم پیشرفته شی گرایی

در درس بعدی با یکی از مهم‌ترین مفاهیم برنامه‌نویسی شیءگرا یعنی وراثت (Inheritance) در پایتون آشنا می‌شویم. وراثت به ما کمک می‌کند یک کلاس جدید را بر اساس یک کلاس موجود ایجاد کنیم و ویژگی‌ها و متدهای آن را بدون نوشتن دوباره کد، استفاده کنیم. در این بخش یاد می‌گیریم چگونه کلاس والد و فرزند ایجاد کنیم، از تابع super() استفاده کنیم و با بازنویسی متدها، رفتار کلاس‌ها را تغییر دهیم.

گام بعدی : وراثت در پایتون

برای شرکت در آزمون آماده‌اید؟

با ورود به پنل کاربری می‌توانید جهت ثبت نام در آزمون‌ها و دسترسی به منابع آموزشی اقدام نمایید. کارشناسان ما در اسرع وقت با شما تماس می‌گیرند.

شروع کار با Django

شروع کار با Django در دوره آموزش جامع پایتون با مفاهیمی مانند متغیرها، شرط‌ها، حلقه‌ها، توابع، کلاس‌ها، فایل‌ها و کار

ادامه مطلب »

عملیات CRUD در SQLite

عملیات CRUD درSQLite در بخش قبل با مفهوم پایگاه داده، SQLite و نحوه اتصال پایتون به پایگاه داده آشنا شدیم.

ادامه مطلب »

توابع در پایتون

توابع در پایتون اگر هنگام برنامه‌نویسی مجبور شوید یک قطعه کد را بارها تکرار کنید، برنامه شما طولانی، شلوغ و

ادامه مطلب »

مجموعه در پایتون

مجموعه (Set) در پایتون به زبان ساده، Set مجموعه‌ای از عناصر منحصربه‌فرد (Unique) است که ترتیب مشخصی ندارد و اجازه

ادامه مطلب »

تاپل در پایتون

تاپل (Tuple) در پایتون بعد از آشنایی با لیست (List)، نوبت به یکی دیگر از ساختارهای داده در پایتون یعنی

ادامه مطلب »

لیست در پایتون

لیست (List) در پایتون پرکاربردترین ساختار داده​ تا اینجا یاد گرفتید که هر متغیر فقط یک مقدار را در خود

ادامه مطلب »

آموزش نصب پایتون

آموزش نصب پایتون و ابزارهای موردنیاز (راهنمای کامل برای ویندوز) اگر تصمیم گرفته‌اید برنامه‌نویسی را یاد بگیرید، احتمالاً نام زبان

ادامه مطلب »