آموزش جامع برنامه‌نویسی شی‌گرا (OOP) در پایتون از مقدماتی تا پیشرفته 🐍🚀

آموزش جامع برنامه‌نویسی شی‌گرا (OOP) در پایتون از مقدماتی تا پیشرفته 🐍🚀

برنامه‌نویسی شی‌گرا (OOP) یک پارادایم قدرتمند در پایتون است که به شما کمک می‌کد کدهای منظم‌تر، قابل استفاده مجدد و مقیاس‌پذیر بنویسید. در این آموزش با مفاهیم کلاس و شی در پایتون آشنا می‌شویم.

مفاهیم پایه شی‌گرایی 🧠

1.1 چهار اصل اصلی OOP:

  • کپسوله سازی (Encapsulation): پنهان‌سازی جزئیات داخلی

  • وراثت (Inheritance): استفاده مجدد از کد

  • چندریختی (Polymorphism): یک رابط، چند پیاده‌سازی

  • انتزاع (Abstraction): ساده‌سازی پیچیدگی‌ها

1.2 مقایسه رویه‌ای و شی‌گرا:

python


# رویه‌ای
def calculate_area(width, height):
    return width * height

# شی‌گرا
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height


ساختار کلاس و شی 🏗️

2.1 تعریف کلاس پایه:

python


class Person:
    # متد سازنده (Constructor)
    def __init__(self, name, age):
        self.name = name  # ویژگی public
        self.age = age
        self.__secret = "این خصوصی است"  # ویژگی private
    
    # متد نمونه
    def introduce(self):
        print(f"سلام، من {self.name} هستم و {self.age} سال دارم 👋")
    
    # متد getter برای ویژگی private
    def get_secret(self):
        return self.__secret

2.2 ایجاد شی و استفاده:

python


# ایجاد نمونه
p1 = Person("علی", 30)

# دسترسی به ویژگی‌ها
print(p1.name)  # علی
p1.introduce()  # سلام، من علی هستم و 30 سال دارم 👋

# دسترسی به ویژگی خصوصی
print(p1.get_secret())  # این خصوصی است


متدهای ویژه و اوررایدینگ ✨

3.1 متدهای جادویی (Magic Methods):

python


class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    # اورراید عملگر +
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    # اورراید نمایش رشته‌ای
    def __str__(self):
        return f"Vector({self.x}, {self.y})"
    
    # اورراید طول شی (len)
    def __len__(self):
        return int((self.x**2 + self.y**2)**0.5)

3.2 استفاده از متدهای جادویی:

python


v1 = Vector(2, 3)
v2 = Vector(5, 7)
v3 = v1 + v2  # استفاده از __add__

print(v3)  # Vector(7, 10) - استفاده از __str__
print(len(v1))  # 3.605 - استفاده از __len__


وراثت و چندریختی 🧬

4.1 وراثت ساده:

python


class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        raise NotImplementedError("زیرکلاس باید این متد را پیاده‌سازی کند")

class Dog(Animal):
    def speak(self):
        return "هاپ هاپ! 🐕"

class Cat(Animal):
    def speak(self):
        return "میوو! 🐈"

4.2 وراثت چندگانه:

python


class A:
    def method(self):
        print("متد A")

class B:
    def method(self):
        print("متد B")

class C(A, B):
    pass

obj = C()
obj.method()  # متد A (به ترتیب MRO)


کپسوله سازی و اصلاح کننده‌های دسترسی 🔒

5.1 سطوح دسترسی:

python


class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner       # public
        self._balance = balance  # protected
        self.__pin = "1234"      # private
    
    # Getter
    @property
    def balance(self):
        return self._balance
    
    # Setter
    @balance.setter
    def balance(self, value):
        if value >= 0:
            self._balance = value
        else:
            print("موجودی نمی‌تواند منفی باشد!")

5.2 استفاده:

python


acc = BankAccount("رضا", 1000)
print(acc.balance)  # 1000
acc.balance = 1500  # استفاده از setter
acc.balance = -500  # خطا: موجودی نمی‌تواند منفی باشد!


متدهای کلاس و استاتیک ⚙️

6.1 تفاوت‌ها:

python


class MyClass:
    class_var = "متغیر کلاس"
    
    def __init__(self, value):
        self.value = value
    
    # متد نمونه (دسترسی به self)
    def instance_method(self):
        return f"مقدار: {self.value}"
    
    # متد کلاس (دسترسی به cls)
    @classmethod
    def class_method(cls):
        return f"متغیر کلاس: {cls.class_var}"
    
    # متد استاتیک (بدون دسترسی به self یا cls)
    @staticmethod
    def static_method(x, y):
        return x + y

6.2 استفاده:

python


obj = MyClass(10)

print(obj.instance_method())  # مقدار: 10
print(MyClass.class_method())  # متغیر کلاس: متغیر کلاس
print(MyClass.static_method(5, 3))  # 8


پروژه عملی: سیستم بانکداری 💳

python


class BankAccount:
    __accounts_count = 0  # متغیر کلاس خصوصی
    
    def __init__(self, owner, initial_balance=0):
        BankAccount.__accounts_count += 1
        self.owner = owner
        self.__balance = initial_balance
        self.__account_number = BankAccount.__accounts_count
    
    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
            print(f"مبلغ {amount} با موفقیت واریز شد ✅")
        else:
            print("مبلغ واریزی باید مثبت باشد!")
    
    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"مبلغ {amount} با موفقیت برداشت شد ✅")
        else:
            print("موجودی کافی نیست یا مبلغ نامعتبر است!")
    
    @property
    def balance(self):
        return self.__balance
    
    @classmethod
    def get_accounts_count(cls):
        return cls.__accounts_count
    
    def __str__(self):
        return f"حساب شماره {self.__account_number} - مالک: {self.owner} - موجودی: {self.__balance}"

class SavingsAccount(BankAccount):
    def __init__(self, owner, initial_balance=0, interest_rate=0.01):
        super().__init__(owner, initial_balance)
        self.interest_rate = interest_rate
    
    def add_interest(self):
        interest = self.balance * self.interest_rate
        self.deposit(interest)
        print(f"سود {interest} به حساب اضافه شد 💰")


الگوهای طراحی شی‌گرا 🎨

8.1 Singleton (تک نمونه):

python


class Singleton:
    __instance = None
    
    def __new__(cls):
        if cls.__instance is None:
            cls.__instance = super().__new__(cls)
        return cls.__instance

8.2 Factory (کارخانه):

python


class Shape:
    def draw(self):
        pass

class Circle(Shape):
    def draw(self):
        print("رسم دایره ⭕")

class Square(Shape):
    def draw(self):
        print("رسم مربع ◼️")

class ShapeFactory:
    @staticmethod
    def create_shape(shape_type):
        if shape_type == "circle":
            return Circle()
        elif shape_type == "square":
            return Square()
        else:
            raise ValueError("نوع شکل نامعتبر است")

8.3 Observer (ناظر):

python


class Subject:
    def __init__(self):
        self.__observers = []
    
    def register(self, observer):
        self.__observers.append(observer)
    
    def notify_all(self, message):
        for observer in self.__observers:
            observer.update(message)

class Observer:
    def update(self, message):
        print(f"پیام دریافت شد: {message}")


جمع‌بندی و مسیر یادگیری بعدی 🏁

سطح‌بندی مهارت‌ها:

  1. مبتدی: درک مفاهیم پایه کلاس و شی

  2. متوسط: تسلط بر وراثت و چندریختی

  3. پیشرفته: پیاده‌سازی الگوهای طراحی و معماری‌های پیچیده

منابع پیشنهادی برای ادامه یادگیری:

  • کتاب "طراحی شی‌گرا در پایتون"

  • دوره "Advanced Python" در سایت‌های آموزشی

  • پروژه‌های عملی مانند سیستم‌های مدیریت موجودی یا کتابخانه

تمرین‌های پیشنهادی:

  1. سیستم مدیریت کتابخانه با کلاس‌های Book, Member, Library

  2. ماشین حساب علمی با استفاده از متدهای ویژه

  3. سیستم رزرواسیون هتل با الگوی طراحی مناسب

سیدهادی موسوی
تاریخ عضویت: 2025/04/23

سلام. من هادی هستم.

علایق: کتاب
سرگرمی ها: برنامه نویسی
امتیاز کاربران به نویسنده: 5.0
تعداد رأی: 1
Avatar

نویسنده

سیدهادی موسوی

تعداد لایک‌ها: 2

Tags: #برنامه_نویسی

ارسال نظر

نظرات