در بخشهای قبلی مجموعه آموزش پایتون، با مفاهیم پایه، متغیرها، شرطها، حلقهها، توابع، دیکشنریها، محدوده متغیرها و ساخت پروژههای کوچک آشنا شدیم. در این بخش وارد یکی از مهمترین مفاهیم برنامهنویسی حرفهای یعنی برنامهنویسی شیگرا (Object-Oriented Programming) میشویم.
در این قسمت یاد میگیریم چگونه در پایتون با کلاسها و اشیاء کار کنیم، اطلاعات و رفتارهای مرتبط را در کنار هم قرار دهیم، از وراثت استفاده کنیم و همچنین با مفاهیمی مانند پکیجها، ماژولها، Tuple، Slicing و توابع سطح بالا آشنا میشویم.
این آموزش با الهام از دوره Python Bootcamp از Angela Yu و با بازنویسی آموزشی، مثالهای تکمیلی و تمرینهای اختصاصی تهیه شده است.
- آشنایی با برنامهنویسی شیگرا (OOP)
- ساخت کلاسها در پایتون
- سازنده کلاس و متد __init__
- ساخت متدها در کلاسها
- ارتباط بین اشیاء
- کار با ماژولها و پکیجها در پایتون
- وراثت در پایتون (Inheritance)
- Tuple و Slicing در پایتون
- توابع سطح بالا (Higher Order Functions)
- پروژه ساخت سیستم مدیریت کتابخانه
- تمرینهای برنامهنویسی این بخش همراه با پاسخ
1. آشنایی با برنامهنویسی شیگرا (OOP)
مفهوم برنامهنویسی شیگرا چیست؟
تا اینجا بیشتر برنامههای ما به روش برنامهنویسی رویهای (Procedural Programming) نوشته میشدند. در این روش معمولاً دادهها و توابع جدا از یکدیگر قرار دارند و برنامه بیشتر حول توابع و مراحل اجرای برنامه سازماندهی میشود
اما در پروژههای بزرگتر، مدیریت این روش سختتر میشود. برنامهنویسی شیگرا کمک میکند برنامه را به بخشهایی به نام شیء (Object) تقسیم کنیم.
در دنیای واقعی هر چیزی میتواند یک شیء باشد.
برای مثال یک خودرو را در نظر بگیرید:
ویژگیهای خودرو:
- رنگ
- مدل
- سرعت
- میزان سوخت
رفتارهای خودرو:
- حرکت کردن
- ترمز گرفتن
- روشن شدن
در برنامهنویسی شیگرا نیز هر شیء دارای:
- Attribute (ویژگی) → اطلاعات مربوط به شیء
- Method (متد) → کارهایی که شیء انجام میدهد
است.
کلاس و شیء چه تفاوتی دارند؟
Class مانند یک نقشه یا قالب است.
برای مثال نقشه ساخت یک ساختمان، خود ساختمان نیست؛ بلکه دستور ساخت آن است.
در پایتون نیز کلاس مشخص میکند یک شیء چه ویژگیها و رفتارهایی داشته باشد.
اما Object یک نمونه ساختهشده از آن کلاس است.
مثلاً:
class Car:
pass
my_car = Car()در این مثال:
Carیک کلاس است.my_carیک شیء ساختهشده از کلاس Car است.
2. ساخت کلاسها در پایتون
ایجاد یک کلاس ساده
برای ساخت کلاس از کلمه کلیدی class استفاده میکنیم.
در نامگذاری کلاسها معمولاً از روش PascalCase استفاده میکنیم؛ یعنی اولین حرف هر کلمه بزرگ نوشته میشود.
مثال:
class Student:
passروشهای رایج نامگذاری:
PascalCase
حرف اول هر کلمه بزرگ نوشته میشود و بین کلمات فاصله یا _ نیست؛ مخصوص کلاسها:
class BankAccount:
passsnake_case
همه کلمات معمولاً با حروف کوچک نوشته میشوند و با _ از هم جدا میشوند؛ برای متغیرها و توابع:
student_name = "Ali"camelCase
کلمه اول با حرف کوچک شروع میشود و حرف اول کلمات بعدی بزرگ است؛ در پایتون کمتر استفاده میشود:
studentName = "Ali"اضافه کردن ویژگی به شیء
میتوانیم بعد از ساخت شیء، ویژگیهایی به آن اضافه کنیم:
class Student:
pass
student1 = Student()
student1.name = "Ali"
student1.age = 20
print(student1.name)خروجی:
Aliاما این روش برای پروژههای بزرگ مناسب نیست، چون مجبور میشویم برای هر شیء دوباره اطلاعات را وارد کنیم.
اینجاست که سازنده کلاس وارد میشود.
3. سازنده کلاس و متد init
متد init چیست؟
متد __init__ یک تابع ویژه است که هنگام ساخته شدن هر شیء به صورت خودکار اجرا میشود.
به آن Constructor یا سازنده میگوییم.
مثال:
class Student:
def __init__(self):
print("A new student created")
student1 = Student()
student2 = Student()خروجی:
A new student created
A new student createdهر بار که یک شیء ساخته میشود، این متد اجرا خواهد شد.
ارسال اطلاعات هنگام ساخت شیء
معمولاً اطلاعات مورد نیاز را هنگام ساخت شیء ارسال میکنیم.
مثال:
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
student1 = Student("Sara", 22)
print(student1.name)
print(student1.age)خروجی:
Sara
22مفهوم self در پایتون
کلمه self به همان شیئی اشاره میکند که در حال استفاده از کلاس است.
مثلاً:
self.name = nameیعنی:
“مقدار name را داخل همین شیء ذخیره کن.”
هر شیء مقدار مخصوص خودش را دارد.
مثال:
class User:
def __init__(self, username):
self.username = username
user1 = User("Ali")
user2 = User("Sara")
print(user1.username)
print(user2.username)خروجی:
Ali
Sara4. ساخت متدها در کلاسها
متد چیست؟
متد یک تابع است که داخل کلاس تعریف میشود و رفتار یک شیء را مشخص میکند.
مثلاً یک حساب بانکی میتواند عملیات برداشت داشته باشد.
class BankAccount:
def __init__(self, owner, balance):
self.owner = owner
self.balance = balance
def withdraw(self, amount):
self.balance -= amount
account = BankAccount("Ali", 1000)
account.withdraw(200)
print(account.balance)خروجی:
800در اینجا:
- ویژگیها: صاحب حساب و موجودی
- متد: برداشت پول
هستند.
5. ارتباط بین اشیاء
یکی از قابلیتهای مهم OOP این است که اشیاء میتوانند با هم تعامل داشته باشند.
مثال:
class User:
def __init__(self, name):
self.name = name
self.followers = 0
self.following = 0
def follow(self, user):
user.followers += 1
self.following += 1
user1 = User("Ali")
user2 = User("Sara")
user1.follow(user2)
print(user1.following)
print(user2.followers)خروجی:
1
1یعنی علی یک نفر را دنبال کرده و تعداد دنبالکنندگان سارا افزایش پیدا کرده است.
6. کار با ماژولها و پکیجها در پایتون
ماژول چیست؟
یک فایل پایتون که شامل کدهای قابل استفاده مجدد باشد، یک ماژول محسوب میشود.
مثلاً:
calculator.pyداخل آن:
def add(a, b):
return a + bحالا میتوانیم در فایل دیگری استفاده کنیم:
import calculator
result = calculator.add(5, 3)
print(result)پکیجهای پایتون
پکیجها مجموعهای از ماژولها هستند که دیگران نوشتهاند و میتوانیم از آنها استفاده کنیم.
منبع معروف پکیجهای پایتون:
pypi.orgبرای نصب یک پکیج (برای مثال پکیج prettytable) در ترمینال مینویسیم:
pip install prettytableبعد از نصب شدن، میتوانیم از آن پکیج در برنامهمان استفاده کنیم:
from prettytable import PrettyTable
table = PrettyTable()
table.add_column("Name", ["Python", "Java"])
table.add_column("Type", ["Language", "Language"])
print(table)7. وراثت در پایتون (Inheritance)
وراثت چیست؟
گاهی یک کلاس ویژگیها و رفتارهای کلاس دیگری را نیاز دارد. در این حالت میتوانیم از وراثت استفاده کنیم.
مثلاً: یک کلاس حیوان داریم:
class Animal:
def breathe(self):
print("Breathing...")حالا کلاس ماهی میتواند از آن ارثبری کند:
class Fish(Animal):
def swim(self):
print("Swimming")
fish = Fish()
fish.breathe()
fish.swim()خروجی:
Breathing...
Swimmingاستفاده از super()
اگر بخواهیم سازنده کلاس والد را اجرا کنیم، از super() استفاده میکنیم.
مثال:
class Animal:
def __init__(self):
self.eyes = 2
class Bird(Animal):
def __init__(self):
super().__init__()
bird = Bird()
print(bird.eyes)خروجی:
28. Tuple و Slicing در پایتون
Tuple چیست؟
Tuple شبیه List است، اما قابل تغییر نیست.
List:
numbers = [1, 2, 3]
numbers[0] = 10اما Tuple:
numbers = (1, 2, 3)
numbers[0] = 10این کد خطا ایجاد میکند؛ زیرا Tuple تغییرپذیر نیست.
Slicing چیست؟
با Slicing میتوانیم بخشی از یک لیست یا رشته را جدا کنیم.
ساختار کلی:
list[start:end:step]مثال:
numbers = [1,2,3,4,5,6]
print(numbers[1:4])خروجی:
[2,3,4]با step:
print(numbers[::2])خروجی:
[1,3,5]برعکس کردن:
print(numbers[::-1])خروجی:
[6,5,4,3,2,1]9. توابع سطح بالا (Higher Order Functions)
Higher Order Function چیست؟
تابعی که بتواند یک تابع دیگر را به عنوان ورودی دریافت کند یا یک تابع برگرداند، یک تابع سطح بالا محسوب میشود.
مثال:
def add(a, b):
return a + b
def calculate(a, b, operation):
return operation(a, b)
result = calculate(5, 3, add)
print(result)خروجی:
8در اینجا تابع add به عنوان ورودی به تابع دیگر ارسال شده است.
10. پروژه کاربردی: ساخت سیستم مدیریت کتابخانه
معرفی پروژه
برای درک بهتر مفاهیم برنامهنویسی شیگرا، یک سیستم ساده مدیریت کتابخانه طراحی میکنیم. در این پروژه از کلاسها، اشیاء، سازنده __init__، متدها، ارتباط بین اشیاء، وراثت و ماژولها استفاده میکنیم.
ساختار پروژه:
library_project/
├── book.py
├── user.py
├── library.py
└── main.pyساخت کلاس کتاب
هر کتاب دارای نام، نویسنده و وضعیت موجود بودن است.
فایل book.py:
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
self.available = True
def borrow(self):
self.available = False
def return_book(self):
self.available = Trueدر این کلاس، اطلاعات کتاب به عنوان Attribute و عملیات گرفتن و بازگرداندن کتاب به عنوان Method تعریف شدهاند.
ساخت کلاس کاربر
هر کاربر میتواند چند کتاب دریافت کند.
فایل user.py:
class User:
def __init__(self, name):
self.name = name
self.books = []
def borrow_book(self, book):
if book.available:
book.borrow()
self.books.append(book)در این قسمت ارتباط بین دو شیء را مشاهده میکنیم. شیء User با استفاده از متدهای شیء Book با آن تعامل دارد.
ساخت کلاس کتابخانه
کلاس کتابخانه مسئول نگهداری مجموعه کتابها است.
فایل library.py:
class Library:
def __init__(self):
self.books = []
def add_book(self, book):
self.books.append(book)در اینجا یک لیست از اشیاء کتاب ایجاد کردهایم.
استفاده از وراثت
فرض کنید مدیر کتابخانه علاوه بر قابلیتهای کاربر، امکان حذف کتاب را هم داشته باشد. میتوانیم از وراثت استفاده کنیم.
from user import User
class Admin(User):
def remove_book(self, library, book):
library.books.remove(book)کلاس Admin تمام ویژگیها و متدهای User را دریافت میکند و فقط قابلیت جدید خود را اضافه میکند.
اجرای پروژه
در فایل اصلی، کلاسها را وارد کرده و اشیاء مورد نیاز را میسازیم:
from book import Book
from user import User
from library import Library
library = Library()
book1 = Book("Python", "Ali")
library.add_book(book1)
user1 = User("Sara")
user1.borrow_book(book1)
print(user1.books[0].title)بررسی مفاهیم استفادهشده
در این پروژه:
- با Class و Object ساختار برنامه را طراحی کردیم.
- با
__init__اطلاعات اولیه اشیاء را مقداردهی کردیم. - با Method رفتارهای هر شیء را مشخص کردیم.
- با ارتباط بین
UserوBookتعامل بین اشیاء را یاد گرفتیم. - با Inheritance قابلیتهای کلاسها را گسترش دادیم.
- با تقسیم فایلها، مفهوم Module را در یک پروژه واقعی مشاهده کردیم.
این پروژه نشان میدهد چگونه میتوان به جای نوشتن کدهای پراکنده، یک برنامه منظم و قابل توسعه با استفاده از برنامهنویسی شیگرا ایجاد کرد.
جمعبندی بخش پنجم
در این بخش با یکی از مهمترین مفاهیم برنامهنویسی حرفهای یعنی برنامهنویسی شیگرا آشنا شدیم. یاد گرفتیم چگونه کلاس و شیء بسازیم، ویژگیها و متدها را تعریف کنیم، از سازنده __init__ استفاده کنیم و بین اشیاء ارتباط ایجاد کنیم.
همچنین با مفاهیمی مانند ماژولها، پکیجها، وراثت، Tuple، Slicing و توابع سطح بالا آشنا شدیم؛ مفاهیمی که در پروژههای واقعی پایتون بسیار کاربرد دارند.
11. چند تمرین برای این بخش:
تمرین ۱: ساخت کلاس کتاب: کلاسی به نام Book بسازید که عنوان و نویسنده را دریافت کند و یک متد برای نمایش اطلاعات کتاب داشته باشد.
مشاهده پاسخ تمرین 1
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
def show_info(self):
print(f"{self.title} by {self.author}")
book1 = Book("Python Basics", "Ali")
book1.show_info()تمرین 2: ساخت کلاس ماشین: کلاسی بسازید که مدل ماشین و سرعت را ذخیره کند و یک متد برای افزایش سرعت داشته باشد.
مشاهده پاسخ تمرین 2
class Car:
def __init__(self, model, speed):
self.model = model
self.speed = speed
def accelerate(self):
self.speed += 10
car = Car("BMW", 100)
car.accelerate()
print(car.speed)تمرین 3: ساخت کلاس حساب بانکی: کلاسی بسازید که امکان واریز و برداشت پول داشته باشد.
مشاهده پاسخ تمرین 3
class Account:
def __init__(self, balance):
self.balance = balance
def deposit(self, amount):
self.balance += amount
def withdraw(self, amount):
self.balance -= amount
account = Account(500)
account.deposit(200)
account.withdraw(100)
print(account.balance)تمرین 4: استفاده از وراثت: یک کلاس حیوان و یک کلاس سگ بسازید که سگ از حیوان ارثبری کند.
مشاهده پاسخ تمرین 4
class Animal:
def eat(self):
print("Eating food")
class Dog(Animal):
def bark(self):
print("Woof!")
dog = Dog()
dog.eat()
dog.bark()تمرین 5: استفاده از Higher Order Function: تابعی بنویسید که یک عملیات ریاضی دریافت کند.
مشاهده پاسخ تمرین 5
def multiply(a, b):
return a * b
def calculator(a, b, func):
return func(a, b)
result = calculator(4, 5, multiply)
print(result)
آی آر سورس کد |