فروشگاه آنلاین
کلاسهای
User،ProductوComment(همانmodels.py) بالای کدت آماده است وfrom models import User, Product, Commentهم کار میکند. هر نظر هنگام ساخته شدن بهuser.commentsوproduct.commentsاضافه میشود.
میخواهیم یک فروشگاه آنلاین را پیادهسازی کنیم که در آن کالاهایی را برای فروش بگذاریم و کاربران آنها را خریداری کنند و نظرات خود را راجعبه کالاها بگذارند. بخشی از کد فروشگاه توسط فردی زده شدهاست و در حال حاضر در دسترس نیست. شما باید به آن امکاناتی اضافه کنید.
داخل پروژه، دو فایل پایتون با نامهای models.py و store.py قرار دارد. شما باید توابع ناقص فایل store.py را تکمیل کنید. تغییرات شما در فایل models.py نادیده گرفته خواهند شد.
🏪 کلاس Store
🔹 init(self)
products: دیکشنری با کلیدProductو مقدارint(موجودی)users: لیست از اشیاءUserاین تابع از پیش پیادهسازی شدهاست و نیازی به اعمال تغییر در آن نیست.
🔹 remove_product(self, product, amount=1)
موجودی کالا را به اندازهی
amountکاهش میدهد.خطا:
"Not Enough Products"(اگر موجودی کافی نباشد)اگر موجودی به صفر رسید، کالا از دیکشنری حذف میشود.
🔹 add_user(self, username)
کاربر جدید را به لیست کاربران اضافه میکند.
موفقیت: نام کاربری را برمیگرداند
توجه: اگر نام کاربری تکراری باشد،
Noneبرمیگرداند
🔹 get_total_asset(self)
مجموع قیمت کالاهای موجود در فروشگاه را برمیگرداند.
💡 قیمت هر کالا در
product.priceذخیره شده است.
🔹 get_total_profit(self)
مجموع قیمت کالاهای فروختهشده را برمیگرداند.
💡 کالاهای خریداریشده در
user.bought_productsذخیره شدهاند.
🔹 get_comments_by_user(self, user)
لیست متن نظرات نوشتهشده توسط کاربر را برمیگرداند.
💡 نظرات کاربر در
user.commentsذخیره شدهاند.
🔹 get_inflation_affected_product_names(self)
لیست نام کالاهایی که تورم روی آنها تأثیر گذاشته است را برمیگرداند.
💡 کالایی تحت تأثیر تورم است که کالای همنام با قیمت کمتر در فروشگاه وجود داشته باشد.
🔹 clean_old_comments(self, date)
تمام نظراتی که قبل از تاریخ
dateثبت شدهاند را حذف میکند.
🔹 clean_comments_by_bought_users(self, product)
لیست متن نظرات کالای ورودی را که کاربر نویسنده، خریدار آن نیز بوده است، برمیگرداند.
💡 بررسی کنید که کاربر کالا را در
bought_productsخود داشته باشد.
✅ پاسخ نهایی
from models import User, Product, Comment
class Store:
def __init__(self):
self.products = {}
self.users = []
def remove_product(self, product, amount=1):
if product not in self.products or self.products[product] < amount:
raise ValueError("Not Enough Products")
self.products[product] -= amount
if self.products[product] == 0:
del self.products[product]
def add_user(self, username):
for user in self.users:
if user.username == username:
return None
new_user = User(username)
self.users.append(new_user)
return username
def get_total_asset(self):
total = 0
for product, quantity in self.products.items():
total += product.price * quantity
return total
def get_total_profit(self):
total = 0
for user in self.users:
for product in user.bought_products:
total += product.price
return total
def get_comments_by_user(self, user):
return [comment.text for comment in user.comments]
def get_inflation_affected_product_names(self):
result = set()
products_list = list(self.products.keys())
for i in range(len(products_list)):
for j in range(i + 1, len(products_list)):
p1 = products_list[i]
p2 = products_list[j]
if p1.name == p2.name and p1.price != p2.price:
result.add(p1.name)
return list(result)
def clean_old_comments(self, date):
for user in self.users:
user.comments = [
comment for comment in user.comments
if comment.date >= date
]
for product in self.products:
product.comments = [
comment for comment in product.comments
if comment.date >= date
]
def clean_comments_by_bought_users(self, product):
result = []
for comment in product.comments:
if comment.user in self.users and product in comment.user.bought_products:
result.append(comment.text)
return result
📄 store.py
📖 توضیح کد
- متد
remove_product: موجودی کالا را کاهش میدهد. اگر موجودی کافی نباشد، خطای"Not Enough Products"پرتاب میشود. - متد
add_user: با پیمایش لیست کاربران، تکراری بودن را بررسی میکند. اگر تکراری نباشد، کاربر جدید ساخته میشود. - متد
get_total_asset: مجموع قیمت تمام کالاهای موجود در فروشگاه را محاسبه میکند. - متد
get_total_profit: مجموع قیمت کالاهای خریداریشده توسط همهی کاربران را محاسبه میکند. - متد
get_comments_by_user: با استفاده از لیستuser.comments، متن نظرات را استخراج میکند. - متد
get_inflation_affected_product_names: با مقایسهی کالاهای همنام با قیمتهای متفاوت، نام کالاهای تحت تأثیر تورم را پیدا میکند. - متد
clean_old_comments: نظراتی که تاریخ آنها قبل از تاریخ ورودی است را از کاربران و محصولات حذف میکند. - متد
clean_comments_by_bought_users: نظراتی را برمیگرداند که کاربر نویسنده، خود کالا را نیز خریده باشد.
- در متد
remove_product، اگر موجودی به صفر رسید، کالا از دیکشنری حذف میشود- در متد
add_user، اگر نام کاربری تکراری باشد،Noneبرگردانده میشود- در متد
get_inflation_affected_product_names، ازsetبرای جلوگیری از تکرار نامها استفاده شده است- در متد
clean_old_comments، نظرات هم از کاربران و هم از محصولات حذف میشوند
🚀 پس از تکمیل متدها، میتوانید فروشگاه را با محصولات و کاربران مختلف تست کنید.
نمونهها
s = Store()
pen = Product("pen", 10)
s.products[pen] = 3
s.remove_product(pen, 2)
s.products[pen]
s.remove_product(pen)
pen in s.products
try:
s.remove_product(pen)
except Exception as error:
print(error)1 False Not Enough Products
s = Store()
[s.add_user("ali"), s.add_user("sara"), s.add_user("ali")]
[u.username for u in s.users]['ali', 'sara', None] ['ali', 'sara']
s = Store()
s.products[Product("pen", 10)] = 3
s.products[Product("book", 120)] = 2
s.get_total_asset()
s.add_user("ali")
s.add_user("sara")
s.users[0].bought_products += [Product("pen", 10), Product("book", 120)]
s.users[1].bought_products.append(Product("pen", 12))
s.get_total_profit()270 'ali' 'sara' 142
from datetime import date
s = Store()
s.add_user("ali")
ali = s.users[0]
pen = Product("pen", 10)
s.products[pen] = 1
Comment(ali, pen, "too small", date(2024, 1, 1))
Comment(ali, pen, "writes well", date(2024, 6, 1))
s.get_comments_by_user(ali)
s.clean_old_comments(date(2024, 3, 1))
[s.get_comments_by_user(ali), [c.text for c in pen.comments]]'ali' ['too small', 'writes well'] [['writes well'], ['writes well']]
s = Store()
for name, price in [("pen", 10), ("pen", 12), ("book", 50), ("book", 50), ("cup", 5), ("cup", 9)]:
s.products[Product(name, price)] = 1
sorted(s.get_inflation_affected_product_names())['cup', 'pen']
from datetime import date
s = Store()
s.add_user("buyer")
s.add_user("visitor")
buyer, visitor = s.users
pen = Product("pen", 10)
s.products[pen] = 5
buyer.bought_products.append(pen)
Comment(buyer, pen, "worth it", date(2024, 5, 5))
Comment(visitor, pen, "looks nice", date(2024, 5, 6))
s.clean_comments_by_bought_users(pen)'buyer' 'visitor' ['worth it']
برای نوشتن پاسخ و دریافت امتیاز، ابتدا وارد حساب شوید.
ورود