برنامهسازی شیءگرا برای مدیریت پیچیدگی ساخته شد: وقتی برنامه بزرگ میشود، میخواهیم داده و رفتاری که به هم مربوطاند در یک واحد زندگی کنند و بیرون فقط از یک قرارداد تمیز با آنها حرف بزند.
شیء در برابر کلاس
نقشهٔ ساخت شیءها: مشخص میکند هر شیء چه دادهای (ویژگی) و چه رفتاری (متد) دارد. خودِ نقشه کاری انجام نمیدهد؛ شیءها انجام میدهند.
نمونهٔ زندهٔ یک کلاس با حالت (مقادیر ویژگیهای) مخصوص خودش. دو شیء از یک کلاس، رفتار مشترک اما حالت مستقل دارند.
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.
طراحی کلاس کتابخانه
صورت مسئله
راهحل گامبهگام
سنجش فهم — شیء و کلاس
۰ از ۳ پاسخ داده شده