کلاس و شیء
- کلاس با
__init__وselfبنویسی - متد بنویسی و آن را روی شیء صدا بزنی
- بفهمی چرا متدها همدیگر را با
self.صدا میزنند - تفاوت «ارجاع» و «کپی» را بدانی
چرا کلاس؟
تا اینجا داده (دیکشنری کالاها، لیست فروشها) و توابع جدا بودند. کلاس آنها را کنار هم میگذارد: یک «فروشگاه» که هم دادههایش را دارد هم کارهایی که روی آنها انجام میشود (افزودن، فروش، گزارش).
اولین کلاس
خودت امتحان کن
class Counter:قالب را تعریف میکند. اسم کلاس با حرف بزرگ شروع میشود.__init__(دو زیرخط دو طرف) سازنده است و خودکار موقعCounter()اجرا میشود.selfیعنی «همین شیء».self.countیک ویژگی است که روی شیء میماند.- متدها همیشه
selfرا بهعنوان پارامتر اول دارند، ولی موقع صدا زدن آن را نمینویسی:c.add(3).
کلاس Shop در خط ۸ پروژه تا خط ۱۲ پروژه: سازنده دو ویژگی self.products و self.sales را میسازد و بلافاصله self.load() را صدا میزند. شیء واقعی در خط ۶۵ پروژه ساخته میشود: shop = Shop().
کیف پول
کلاس Wallet بنویس: سازنده self.balance = 0 بگذارد؛ متد deposit(amount) به موجودی اضافه کند؛ متد withdraw(amount) اگر موجودی کافی نبود ValueError بدهد وگرنه کم کند.
دیدن راهحل (اول خودت تلاش کن)
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() را صدا میزند تا تغییر در فایل ذخیره شود (خط ۳۴ پروژه، خط ۴۲ پروژه، خط ۴۸ پروژه، خط ۶۰ پروژه).
ارجاع، نه کپی
وقتی یک دیکشنری را در متغیر دیگری میگذاری، کپی ساخته نمیشود؛ هر دو اسم به همان دیکشنری اشاره میکنند:
خودت امتحان کن
متد sell از همین استفاده میکند: خط ۵۵ پروژه product = self.products[name] و خط ۵۸ پروژه product['qty'] -= qty موجودی اصلی را کم میکند.
فروشگاه کوچک
کلاس MiniShop بنویس با self.products = {} در سازنده و دو متد:
add(name, qty): اگر نام خالی یا تکراری بود ValueError بدهد، وگرنه self.products[name] = {'qty': qty}.
sell(name, qty): اگر کالا نبود یا موجودی کافی نبود ValueError بدهد، وگرنه موجودی را کم کند.
دیدن راهحل (اول خودت تلاش کن)
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
خطها را مرتب کن
اسکلت کلاس را مرتب کن:
def __init__(self):self.load()self.products = {}self.sales = []class Shop:
آزمون این درس
برای گذراندن این درس حداقل ۸۰٪ جواب درست لازم است. هر چند بار خواستی میتوانی دوباره امتحان بدهی.