۴. ثبت فروش و گزارش¶
خط ۵۰ تا ۶۳
دو متد آخر کلاس به فروش مربوطاند. sell موجودی کالا را کم میکند و یک رکورد فروش میسازد، و report از روی همهی رکوردها تعداد کل و درآمد کل را حساب میکند.
کد این بخش¶
50 def sell(self, name, qty):51 if name not in self.products:52 raise ValueError('کالا پیدا نشد')53 if qty <= 0:54 raise ValueError('تعداد باید مثبت باشد')55 product = self.products[name]56 if qty > product['qty']:57 raise ValueError('موجودی کافی نیست')58 product['qty'] -= qty59 self.sales.append({'name': name, 'qty': qty, 'total': qty * product['sell']})60 self.save()61 62 def report(self):63 return sum(s['qty'] for s in self.sales), sum(s['total'] for s in self.sales)
روی شمارهی هر خط بزن تا به توضیحش بروی؛ روی «خط …» در توضیح بزن تا همان خط در کد روشن شود.
توضیح خط به خط¶
- خط ۵۰
def sell(self, name, qty):¶ - متد
sellنام کالا و تعداد فروش را میگیرد. از تابعsellبیرون کلاس (خط ۱۰۳) صدا زده میشود. - خط ۵۳
if qty <= 0:¶ - تعداد فروش باید بزرگتر از صفر باشد. اینجا برخلاف خط ۳۱ صفر هم پذیرفته نمیشود، چون فروش صفر عدد معنی ندارد.
- خط ۵۵
product = self.products[name]¶ - دیکشنری کالا را در متغیر
productمیگذارد. این کپی نیست، یک «ارجاع» به همان دیکشنری داخلself.productsاست؛ هر تغییری رویproductمستقیم روی دادهی اصلی اثر میگذارد. - خط ۵۸
product['qty'] -= qty¶ -=یعنی «از خودش کم کن». موجودی کالا به اندازهی تعداد فروش کم میشود. چونproductارجاع است (خط ۵۵)،self.productsهم عوض شده است.- خط ۵۹
self.sales.append({'name': name, 'qty': qty, 'total': qty * product['sell']})¶ - یک رکورد فروش به انتهای لیست اضافه میکند.
totalبا قیمت فروش همین لحظه حساب میشود، پس اگر بعداً قیمت را ویرایش کنی (خط ۴۱)، مبلغ فروشهای قبلی ثابت میماند.
یادداشت
مثال: اگر در sales دو رکورد {'qty': 2, 'total': 30} و {'qty': 5, 'total': 100} باشد، report() مقدار (7, 130) را برمیگرداند.
ارتباط با بقیهی کد¶
همچنین ببینید
Shop.sell- با دکمهی «ثبت فروش»: تابع
sellخط ۱۰۲ ←shop.sell(نام، تعداد)خط ۱۰۳. Shop.report- با دکمهی «گزارش فروش»: تابع
reportخط ۱۰۹ ← خط ۱۱۰، که تاپل را بهcountوincomeباز میکند و در خط ۱۱۱ نشان میدهد. self.sales- در سازنده خط ۱۱ ساخته و در
loadخط ۲۴ از فایل پر میشود. product['qty']- موجودی کمشده بعد از فروش، با
refreshدر خط ۸۷ دوباره در جدول نمایش داده میشود (خط ۱۱۸).
سؤالهای تمرینی¶
اول خودت جواب بده، بعد جواب را باز کن.
چرا
product['qty'] -= qtyدر خط ۵۸ خودself.productsرا هم عوض میکند؟نمایش جواب
چون
productدر خط ۵۵ ارجاع به همان دیکشنری است، نه کپی آن.فروش ۰ عدد خطا میدهد ولی قیمت ۰ پذیرفته میشود. کدام خطها این را تعیین میکنند؟
وقتی هنوز فروشی ثبت نشده،
report()چه برمیگرداند؟نمایش جواب
(0, 0)، چونsumیک دنبالهی خالی صفر است.اگر بعد از فروش قیمت کالا ویرایش شود،
totalآن فروش عوض میشود؟نمایش جواب
نه. خط ۵۹ مبلغ را در لحظهی فروش ذخیره میکند.