Table of Contents
چند مثال ساده برای تمرین OOP
در این فصل فقط با مثال جلو میرویم تا مفاهیم قبلی مثل کلاس، شیء، ویژگی و متد برایتان جا بیفتد. کدها را حتماً خودتان اجرا و با آنها بازی کنید.
مثال ۱: کلاس سادهٔ `Person`
هدف: داشتن یک شیء که اطلاعات یک شخص را نگه دارد و بتوانیم با آن کار کنیم.
class Person:
def __init__(self, name, age):
self.name = name # ویژگی (attribute)
self.age = age # ویژگی (attribute)
def introduce(self):
print(f"سلام، من {self.name} هستم و {self.age} سال دارم.")
# ساخت چند شیء از کلاس Person
p1 = Person("علی", 20)
p2 = Person("نگار", 25)
p1.introduce()
p2.introduce()نکاتی که میتوانید تمرین کنید:
- یک ویژگی جدید مثل
cityاضافه کنید. - یک متد جدید مثل
is_adultبنویسید که بگوید آیا سن شخص بالای ۱۸ است یا نه.
مثال ۲: ماشین حساب ساده به شکل کلاس
هدف: تبدیل یک مفهوم آشنا (ماشینحساب) به کلاس.
class Calculator:
def add(self, a, b):
return a + b
def sub(self, a, b):
return a - b
def mul(self, a, b):
return a * b
def div(self, a, b):
if b == 0:
print("خطا: تقسیم بر صفر مجاز نیست.")
return None
return a / b
calc = Calculator()
print(calc.add(3, 5)) # 8
print(calc.sub(10, 4)) # 6
print(calc.mul(2, 7)) # 14
print(calc.div(10, 2)) # 5.0
print(calc.div(10, 0)) # خطاایده برای تمرین:
- متد
power(a, b)برای توان نوشتن. - متد
sqrt(x)که اگرxمنفی بود پیغام خطا چاپ کند.
مثال ۳: کلاس `BankAccount` (حساب بانکی ساده)
هدف: شبیهسازی یک حساب بانکی خیلی ساده با واریز، برداشت و نمایش موجودی.
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner # صاحب حساب
self.balance = balance # موجودی اولیه
def deposit(self, amount):
if amount <= 0:
print("مبلغ واریز باید مثبت باشد.")
return
self.balance += amount
print(f"{amount} تومان واریز شد. موجودی جدید: {self.balance}")
def withdraw(self, amount):
if amount <= 0:
print("مبلغ برداشت باید مثبت باشد.")
return
if amount > self.balance:
print("موجودی کافی نیست!")
return
self.balance -= amount
print(f"{amount} تومان برداشت شد. موجودی جدید: {self.balance}")
def show_balance(self):
print(f"موجودی حساب {self.owner}: {self.balance} تومان")
acc1 = BankAccount("مریم", 100000)
acc1.show_balance()
acc1.deposit(50000)
acc1.withdraw(200000) # موجودی کافی نیست
acc1.withdraw(30000)
acc1.show_balance()تمرین:
- یک متد
transfer_to(self, other_account, amount)بنویسید که از حساب فعلی به حساب دیگر پول منتقل کند. - در صورت کم بودن موجودی انتقال انجام نشود.
مثال ۴: استفاده از وراثت در مثال حیوانات
در این مثال فقط استفادهٔ عملی از وراثت را میبینیم (تعریف تئوری قبلاً گفته شده).
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
print("این حیوان صدای خاص خود را دارد.")
class Dog(Animal):
def speak(self):
print(f"{self.name}: هاپ هاپ!")
class Cat(Animal):
def speak(self):
print(f"{self.name}: میووو!")
a = Animal("حیوان")
d = Dog("بادی")
c = Cat("پیشی")
a.speak()
d.speak()
c.speak()ایدهها:
- کلاس جدید
Birdاضافه کنید که متدspeakآن "جیک جیک" چاپ کند. - یک متد جدید
infoدرAnimalبسازید و در کلاسهای فرزند هم از آن استفاده کنید.
مثال ۵: مدیریت فهرست کارها (To-Do) با کلاس
هدف: تمرین کار با فهرستها در کنار کلاسها.
class TodoList:
def __init__(self):
self.tasks = [] # فهرست کارها
def add_task(self, title):
self.tasks.append({"title": title, "done": False})
print(f"کار '{title}' اضافه شد.")
def show_tasks(self):
if not self.tasks:
print("هیچ کاری ثبت نشده است.")
return
for i, task in enumerate(self.tasks, start=1):
status = "✓" if task["done"] else "✗"
print(f"{i}. [{status}] {task['title']}")
def mark_done(self, index):
if index < 1 or index > len(self.tasks):
print("شمارهٔ کار معتبر نیست.")
return
self.tasks[index - 1]["done"] = True
print(f"کار شمارهٔ {index} انجام شده علامت خورد.")
def remove_task(self, index):
if index < 1 or index > len(self.tasks):
print("شمارهٔ کار معتبر نیست.")
return
task = self.tasks.pop(index - 1)
print(f"کار '{task['title']}' حذف شد.")
todo = TodoList()
todo.add_task("مطالعهٔ پایتون")
todo.add_task("ورزش")
todo.show_tasks()
todo.mark_done(1)
todo.show_tasks()
todo.remove_task(2)
todo.show_tasks()تمرین:
- متدی بنویسید که فقط کارهای انجامنشده را نمایش دهد.
- متدی اضافه کنید که همهٔ کارهای انجامشده را حذف کند.
مثال ۶: مدلسازی یک کتاب و کتابخانه
در این مثال، چند کلاس با هم کار میکنند.
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.is_borrowed = False
def info(self):
status = "امانت داده شده" if self.is_borrowed else "در دسترس"
print(f"«{self.title}» نوشتهٔ {self.author} - وضعیت: {status}")
class Library:
def __init__(self, name):
self.name = name
self.books = [] # فهرست کتابها
def add_book(self, book):
self.books.append(book)
print(f"کتاب «{book.title}» به کتابخانه اضافه شد.")
def show_books(self):
if not self.books:
print("هیچ کتابی در کتابخانه نیست.")
return
print(f"کتابهای کتابخانهٔ {self.name}:")
for book in self.books:
book.info()
def borrow_book(self, title):
for book in self.books:
if book.title == title:
if book.is_borrowed:
print("این کتاب قبلاً امانت داده شده است.")
else:
book.is_borrowed = True
print(f"کتاب «{title}» امانت داده شد.")
return
print("کتاب مورد نظر پیدا نشد.")
def return_book(self, title):
for book in self.books:
if book.title == title:
if not book.is_borrowed:
print("این کتاب در حال حاضر امانت داده نشده است.")
else:
book.is_borrowed = False
print(f"کتاب «{title}» پس داده شد.")
return
print("کتاب مورد نظر پیدا نشد.")
lib = Library("کتابخانهٔ مرکزی")
b1 = Book("پایتون برای مبتدیان", "احمدی")
b2 = Book("مبانی برنامهنویسی", "کریمی")
lib.add_book(b1)
lib.add_book(b2)
lib.show_books()
lib.borrow_book("پایتون برای مبتدیان")
lib.show_books()
lib.return_book("پایتون برای مبتدیان")
lib.show_books()تمرین:
- ویژگی
year(سال انتشار) بهBookاضافه کنید. - متدی در
Libraryبنویسید که فقط کتابهای در دسترس را نشان دهد.
مثال ۷: شبیهسازی خیلی ساده بازی نمره
هدف: استفاده از کلاس برای نگهداری وضعیت (state).
class Player:
def __init__(self, name):
self.name = name
self.score = 0
def add_score(self, points):
if points < 0:
print("امتیاز منفی مجاز نیست.")
return
self.score += points
print(f"{self.name} {points} امتیاز گرفت. مجموع: {self.score}")
def reset(self):
self.score = 0
print(f"امتیاز {self.name} ریست شد.")
class Game:
def __init__(self, player1_name, player2_name):
self.player1 = Player(player1_name)
self.player2 = Player(player2_name)
def show_scores(self):
print(f"{self.player1.name}: {self.player1.score}")
print(f"{self.player2.name}: {self.player2.score}")
def winner(self):
if self.player1.score > self.player2.score:
print(f"برنده: {self.player1.name}")
elif self.player2.score > self.player1.score:
print(f"برنده: {self.player2.name}")
else:
print("بازی مساوی شد.")
game = Game("سارا", "مهدی")
game.player1.add_score(10)
game.player2.add_score(7)
game.show_scores()
game.winner()تمرین:
- متدی در
Gameبنویسید که امتیاز هر دو بازیکن را ریست کند. - محدودیت حداکثر امتیاز (مثلاً ۲۰) اضافه کنید، و وقتی کسی به آن رسید بازی تمام شود.
پیشنهاد برای تمرین نهایی
۱. یکی از مثالهای بالا را انتخاب کنید.
۲. حداقل دو ویژگی جدید و دو متد جدید به آن اضافه کنید.
۳. سناریو (داستان) کوتاهی بنویسید که توضیح دهد این کلاسها چه چیزی را در دنیای واقعی مدل میکنند.
۴. کد را اجرا کنید و چند ورودی مختلف امتحان کنید.
هر وقت در مثالها احساس راحتی کردید، آمادهاید که در پروژههای کوچک (فصل ۱۷) از OOP به صورت جدیتر استفاده کنید.