آموزش پایتون از صفر – بخش پنجم: برنامه‌نویسی شی‌گرا، کلاس‌ها، ماژول‌ها و مفاهیم پیشرفته پایتون

بازدید: 81 بازدید
آموزش پایتون از صفر بخش پنجم؛ برنامه‌نویسی شی‌گرا، کلاس‌ها و OOP در پایتون

در بخش‌های قبلی مجموعه آموزش پایتون، با مفاهیم پایه، متغیرها، شرط‌ها، حلقه‌ها، توابع، دیکشنری‌ها، محدوده متغیرها و ساخت پروژه‌های کوچک آشنا شدیم. در این بخش وارد یکی از مهم‌ترین مفاهیم برنامه‌نویسی حرفه‌ای یعنی برنامه‌نویسی شی‌گرا (Object-Oriented Programming) می‌شویم.

در این قسمت یاد می‌گیریم چگونه در پایتون با کلاس‌ها و اشیاء کار کنیم، اطلاعات و رفتارهای مرتبط را در کنار هم قرار دهیم، از وراثت استفاده کنیم و همچنین با مفاهیمی مانند پکیج‌ها، ماژول‌ها، Tuple، Slicing و توابع سطح بالا آشنا می‌شویم.

این آموزش با الهام از دوره Python Bootcamp از Angela Yu و با بازنویسی آموزشی، مثال‌های تکمیلی و تمرین‌های اختصاصی تهیه شده است.

فهرست مطالب این بخش

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:
    pass

snake_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
Sara

4. ساخت متدها در کلاس‌ها

متد چیست؟

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

مثلاً یک حساب بانکی می‌تواند عملیات برداشت داشته باشد.

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)

خروجی:

2

8. 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)

ادامه مطلب