خانه / آموزش‌ها / آموزش کلاس‌ها و شی‌گرایی در پایتون

آموزش کلاس‌ها و شی‌گرایی در پایتون

🐍 HomeOfPython
|
📅 1404/10/18

سطح مقدماتی (Beginner Level)

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

۱. مفهوم کلاس (Class) و شیء (Object)

برای درک بهتر، یک نقشه معماری ساختمان را در نظر بگیرید:

  • کلاس (Class): همان نقشه معماری است. این نقشه مشخص می‌کند که ساختمان چه ویژگی‌هایی (تعداد اتاق، متراژ) دارد، اما خودش ساختمان نیست.
  • شیء (Object): ساختمان واقعی ساخته شده از روی آن نقشه است. شما می‌توانید از روی یک نقشه (کلاس)، هزاران ساختمان (شیء) بسازید که هر کدام رنگ یا ساکنان متفاوتی دارند.

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

python
# تعریف یک کلاس ساده (Static - فقط تعریف)
class Car:
    pass

۲. متد سازنده (__init__) و کلمه کلیدی self

وقتی یک شیء جدید می‌سازیم، معمولاً می‌خواهیم ویژگی‌های اولیه (مثل رنگ ماشین یا نام دانشجو) را تنظیم کنیم.

  • __init__: این یک متد خاص است که بلافاصله پس از ساختن شیء اجرا می‌شود.
  • self: اشاره به "همین شیء" دارد. وقتی می‌گوییم self.color = "Red"، یعنی رنگ این ماشین خاص را قرمز کن.
Python

۳. متدها (Methods)

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

Python
python
# مثال ۳: ساختار متد بدون اجرا (Static)
class Calculator:
    def add(self, x, y):
        return x + y

سطح پیشرفته (Professional Level)

در این سطح به سراغ مفاهیم عمیق‌تر OOP مانند ارث‌بری، کپسوله‌سازی و متدهای جادویی می‌رویم که برای توسعه نرم‌افزارهای بزرگ حیاتی هستند.

۱. ارث‌بری (Inheritance) و super()

ارث‌بری به ما اجازه می‌دهد یک کلاس جدید (Child) بسازیم که تمام ویژگی‌های کلاس والد (Parent) را داشته باشد و بتواند آن‌ها را تغییر دهد یا گسترش دهد. تابع super() اجازه می‌دهد به متدهای کلاس والد دسترسی داشته باشیم.

Python

۲. کپسوله‌سازی (Encapsulation)

در پروژه‌های حرفه‌ای، نباید اجازه دهید هر کسی مستقیماً متغیرهای داخلی کلاس را تغییر دهد.

  • Public: name (قابل دسترسی همه)
  • Protected: _name (توافقی: فقط داخل کلاس و فرزندان استفاده شود)
  • Private: __name (غیرقابل دسترسی مستقیم از بیرون)
Python

۳. متدهای کلاسی و استاتیک (@classmethod vs @staticmethod)

همیشه نیاز نیست متدها به self (شیء) دسترسی داشته باشند.

  • @classmethod: به کلاس (cls) دسترسی دارد، نه شیء خاص. برای فکتوری‌ها (Factory Methods) عالی است.
  • @staticmethod: نه به self دسترسی دارد نه به cls. مثل یک تابع معمولی است که فقط منطقاً به کلاس ربط دارد.
Python

۴. متدهای جادویی (Magic/Dunder Methods)

این متدها با دو زیرخط شروع و تمام می‌شوند و رفتار شیء را در شرایط خاص (مثل پرینت کردن یا جمع کردن) تعیین می‌کنند.

  • __str__: نمایش رشته‌ای شیء برای کاربر.
  • __repr__: نمایش رسمی شیء (برای دیباگ).
  • __eq__: مقایسه دو شیء (==).
Python