Python Learningاز صفر تا نوشتن پروژه از حفظ
درس ۹ · ابزارهای پروژه

کلاس و شیء

حدود ۵۵ دقیقه۳ تمرین۶ سؤال آزمون
بعد از این درس می‌توانی:
  • کلاس با __init__ و self بنویسی
  • متد بنویسی و آن را روی شیء صدا بزنی
  • بفهمی چرا متدها همدیگر را با self. صدا می‌زنند
  • تفاوت «ارجاع» و «کپی» را بدانی

چرا کلاس؟

تا اینجا داده (دیکشنری کالاها، لیست فروش‌ها) و توابع جدا بودند. کلاس آن‌ها را کنار هم می‌گذارد: یک «فروشگاه» که هم داده‌هایش را دارد هم کارهایی که روی آن‌ها انجام می‌شود (افزودن، فروش، گزارش).

اولین کلاس

اجرا کن

خودت امتحان کن

Ctrl + Enter
در پروژه‌ی فروشگاه

کلاس Shop در خط ۸ پروژه تا خط ۱۲ پروژه: سازنده دو ویژگی self.products و self.sales را می‌سازد و بلافاصله self.load() را صدا می‌زند. شیء واقعی در خط ۶۵ پروژه ساخته می‌شود: shop = Shop().

تمرین

کیف پول

کلاس Wallet بنویس: سازنده self.balance = 0 بگذارد؛ متد deposit(amount) به موجودی اضافه کند؛ متد withdraw(amount) اگر موجودی کافی نبود ValueError بدهد وگرنه کم کند.

Ctrl + Enter
دیدن راه‌حل (اول خودت تلاش کن)
class Wallet:
    def __init__(self):
        self.balance = 0

    def deposit(self, amount):
        self.balance += amount

    def withdraw(self, amount):
        if amount > self.balance:
            raise ValueError('موجودی کافی نیست')
        self.balance -= amount

متدی که متد دیگر را صدا می‌زند

داخل کلاس، متدها هم‌دیگر را با self. صدا می‌زنند. در برنامه‌ی فروشگاه، هر متدی که داده را عوض می‌کند در آخر self.save() را صدا می‌زند تا تغییر در فایل ذخیره شود (خط ۳۴ پروژه، خط ۴۲ پروژه، خط ۴۸ پروژه، خط ۶۰ پروژه).

ارجاع، نه کپی

وقتی یک دیکشنری را در متغیر دیگری می‌گذاری، کپی ساخته نمی‌شود؛ هر دو اسم به همان دیکشنری اشاره می‌کنند:

اجرا کن

خودت امتحان کن

Ctrl + Enter
در پروژه‌ی فروشگاه

متد sell از همین استفاده می‌کند: خط ۵۵ پروژه product = self.products[name] و خط ۵۸ پروژه product['qty'] -= qty موجودی اصلی را کم می‌کند.

تمرین

فروشگاه کوچک

کلاس MiniShop بنویس با self.products = {} در سازنده و دو متد:

add(name, qty): اگر نام خالی یا تکراری بود ValueError بدهد، وگرنه self.products[name] = {'qty': qty}.

sell(name, qty): اگر کالا نبود یا موجودی کافی نبود ValueError بدهد، وگرنه موجودی را کم کند.

Ctrl + Enter
دیدن راه‌حل (اول خودت تلاش کن)
class MiniShop:
    def __init__(self):
        self.products = {}

    def add(self, name, qty):
        if not name or name in self.products:
            raise ValueError('نام خالی یا کالای تکراری است')
        self.products[name] = {'qty': qty}

    def sell(self, name, qty):
        if name not in self.products:
            raise ValueError('کالا پیدا نشد')
        product = self.products[name]
        if qty > product['qty']:
            raise ValueError('موجودی کافی نیست')
        product['qty'] -= qty
مرتب کن

خط‌ها را مرتب کن

اسکلت کلاس را مرتب کن:

  1. def __init__(self):
  2. self.load()
  3. self.products = {}
  4. self.sales = []
  5. class Shop:

آزمون این درس

برای گذراندن این درس حداقل ۸۰٪ جواب درست لازم است. هر چند بار خواستی می‌توانی دوباره امتحان بدهی.

۱. __init__ کی اجرا می‌شود؟
۲. self در متدها یعنی
۳. برای صدا زدن متد add(self, n) روی شیء c چه می‌نویسی؟
۴. بعد از a = {'x': 1}، b = a و b['x'] = 9، مقدار a['x']؟
۵. داخل کلاس، متد add چطور متد save را صدا می‌زند؟
۶. shop = Shop() چه می‌کند؟