رفتن به محتوای اصلی
برنامه‌سازی پیشرفته با پایتون درس‌نامهٔ آزاد
درس مقدماتی ۲۵ دقیقه

شیءها و کلاس‌ها

از تفکر شیءگرا تا اولین کلاس واقعی: self، سازنده، کپسوله‌سازی و طراحی مسئولیت با پایتون.

هدف این درس

بتوانی یک کلاس خوش‌طراحی با سازنده، متد و قرارداد حریم خصوصی بنویسی و از آن شیء بسازی.

در این مطلب ۴

برنامه‌سازی شیءگرا برای مدیریت پیچیدگی ساخته شد: وقتی برنامه بزرگ می‌شود، می‌خواهیم داده و رفتاری که به هم مربوط‌اند در یک واحد زندگی کنند و بیرون فقط از یک قرارداد تمیز با آن‌ها حرف بزند.

شیء در برابر کلاس

تعریف کلاس

نقشهٔ ساخت شیءها: مشخص می‌کند هر شیء چه داده‌ای (ویژگی) و چه رفتاری (متد) دارد. خودِ نقشه کاری انجام نمی‌دهد؛ شیءها انجام می‌دهند.

تعریف شیء

نمونهٔ زندهٔ یک کلاس با حالت (مقادیر ویژگی‌های) مخصوص خودش. دو شیء از یک کلاس، رفتار مشترک اما حالت مستقل دارند.

class BankAccount:
    """حساب بانکی ساده با موجودی محافظت‌شده."""

    def __init__(self, owner, balance=0.0):
        self.owner = owner
        self._balance = balance  # قرارداد: بیرون مستقیم دست نزن

    def deposit(self, amount):
        if amount <= 0:
            raise ValueError("مبلغ واریز باید مثبت باشد.")
        self._balance += amount

    def withdraw(self, amount):
        if amount <= 0:
            raise ValueError("مبلغ برداشت باید مثبت باشد.")
        if amount > self._balance:
            raise ValueError("موجودی کافی نیست.")
        self._balance -= amount

    @property
    def balance(self):
        return self._balance
ali = BankAccount("علی", 100.0)
sara = BankAccount("سارا")
ali.deposit(50)
print(ali.balance)   # 150.0
print(sara.balance)  # 0.0 — حالت مستقل

self چیست؟

self ارجاع به همان شیئی است که متد رویش صدا زده شده. پایتون آن را خودکار پاس می‌دهد: ali.deposit(50) یعنی BankAccount.deposit(ali, 50). اگر self را در تعریف متد جا بیندازی، فراخوانی با خطای «آرگومان اضافی» می‌شکند.

برداشت نادرست رایج

اشتباه رایج

self یک کلمهٔ کلیدی جادویی است که پایتون خودش می‌فهمد.

تصحیح

self فقط یک قرارداد نام‌گذاری برای اولین پارامتر متد است؛ می‌توانستی اسم دیگری بگذاری، اما هیچ‌کس این کار را نمی‌کند. مهم این است که ارجاع به نمونه را نگه می‌دارد.

کپسوله‌سازی به سبک پایتون

پایتون مثل جاوا عضو خصوصی اجباری ندارد. حریم خصوصی یک قرارداد است: نامِ با یک آندرلاین (_balance) یعنی «جزئیات داخلی؛ مستقیم دست نزن» و نامِ با دو آندرلاین (__balance) فعال‌سازی name mangling است، نه امنیت واقعی.

طراحی مسئولیت

قبل از نوشتن کلاس از خودت بپرس: این کلاس «چه می‌داند» و «چه می‌کند»؟ اگر جواب بیشتر از یک جملهٔ بدون «و» شد، احتمالاً دو کلاس قاطی شده‌اند. همکاری شیءها هم باید از کانال عمومی باشد: سبد خرید از متد balance می‌پرسد، نه از _balance.

مثال حل‌شده

طراحی کلاس کتابخانه

مقدماتی

صورت مسئله

یک کلاس Book بساز که عنوان و تعداد نسخه‌ها را نگه دارد و امانت‌دادنِ بیش از موجودی را رد کند.

راه‌حل گام‌به‌گام

    ۴ گام باقی مانده

    سنجش فهم — شیء و کلاس

    ۰ از ۳ پاسخ داده شده

    1. تفاوت کلاس و شیء در یک جمله چیست؟
    2. _balance با یک آندرلاین در پایتون دقیقاً یعنی چه؟
    3. دو شیء ساخته‌شده از یک کلاس، حالت مستقل از هم دارند.(درست / نادرست)

    اول به همهٔ پرسش‌ها پاسخ دهید، بعد بررسی کنید.

    مطالب مرتبط

    از همین بخش و با برچسب‌های مشترک

    این مطلب را خواندید؟ آن را علامت بزنید تا پیشرفت شما روی همین دستگاه ذخیره شود.

    وضعیت پیشرفت برای شیءها و کلاس‌ها