
آموزش جامع برنامهنویسی شیگرا (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}")
جمعبندی و مسیر یادگیری بعدی 🏁
سطحبندی مهارتها:
-
مبتدی: درک مفاهیم پایه کلاس و شی
-
متوسط: تسلط بر وراثت و چندریختی
-
پیشرفته: پیادهسازی الگوهای طراحی و معماریهای پیچیده
منابع پیشنهادی برای ادامه یادگیری:
-
کتاب "طراحی شیگرا در پایتون"
-
دوره "Advanced Python" در سایتهای آموزشی
-
پروژههای عملی مانند سیستمهای مدیریت موجودی یا کتابخانه
تمرینهای پیشنهادی:
-
سیستم مدیریت کتابخانه با کلاسهای Book, Member, Library
-
ماشین حساب علمی با استفاده از متدهای ویژه
-
سیستم رزرواسیون هتل با الگوی طراحی مناسب

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