Форум сайта python.su
0
Здравствуйте! Помогите пожалуйста со следующей проблемой. Есть 3 класса:
class Order(list):
def __init__(self, discount, total_price, date):
self.discount = discount
self._total_price = total_price
self.date = date
@property
def discount(self):
return self._discount
@discount.setter
def discount(self, value):
low, high = 0, 99
if not low <= value <= high:
raise ValueError("should be in [{}:{}], "
"but passed {}".format(low, high, value))
self._discount = value
@property
def total_price(self):
return self._total_price - self._total_price * self._discount
class Item():
def __init__(self, id, name, description, price):
self.id = id
self.name = name
self.description = description
self.price = price
class DownloadableItem(Item):
def __init__(self, filename, downloads_count):
self.filename = filename
self.downloads_count = downloads_count
Отредактировано megoloman (Март 27, 2016 19:02:18)
Офлайн
221
megoloman
что за бред вы пишете. Где в классе Order имя заказа и его количество? Что собрались выводить? Зачем вы наследуете его от list ? от списка! Ну и где вы собрались использовать groupby ?
Я надеюсь этот код исключительно учебный,а не ,хотя бы с намеком, на реальный.
Офлайн
0
Это тестовое задание:
1. Определить классы Order (discount, total_price, date), Item (id, name, description, price),
DownloadableItem (унаследован от Item с полями filename, downloads_count). Класс Order
унаследовать от list, он будет представлять собой список товаров.
2. Атрибут Order.discount сделать свойством (property) и ограничить диапозоном значений 0…99.
3. Атрибут Order.total_price сделать свойством (property) только для чтения. Значение должно
высчитываться как сумма цен с учетом discount (%).
4. В классе Order определить метод __str__, который выводит содержимое заказа в формате: Имя
товара - Количество товара - Стоимость. Испорльзовать groupby() из модуля itertools.
5. Автоматичски выставлять поле Order.date равное моменту добавления последнего товара в заказ
(переопределить метод append)
Отредактировано megoloman (Март 27, 2016 17:57:46)
Офлайн
857
>>> import itertools >>> >>> class Item: ... def __init__(self, name, price): ... self.name = name ... self.price = price ... >>> class Order(list): ... def __init__(self, name): ... self.name = name ... ... def __str__(self): ... out = self.name + ':\n' ... srt = sorted(self, key=lambda i: i.name) ... grp = itertools.groupby(srt, key=lambda i: i.name) ... for name, it in grp: ... tup = tuple(i.price for i in it) ... n = len(tup) ... fmt = ' {}: number {} | price {}\n' ... out += fmt.format(name, n, tup[0] * n) ... return out ... >>> order = Order('Order 1') >>> order.append(Item('Item 1', 1)) >>> order.append(Item('Item 2', 3)) >>> order.append(Item('Item 1', 1)) >>> order.append(Item('Item 2', 3)) >>> order.append(Item('Item 1', 1)) >>> order.append(Item('Item 2', 3)) >>> order.append(Item('Item 3', 5)) >>> order.append(Item('Item 3', 5)) >>> >>> print(order, end='') Order 1: Item 1: number 3 | price 3 Item 2: number 3 | price 9 Item 3: number 2 | price 10 >>>
Офлайн
0
спасибо!
Отредактировано megoloman (Март 28, 2016 10:31:55)
Офлайн
857
megolomanНу, у тебя товар должен храниться в заказе в том же виде, в котором и добавляется. А общая стоимость или общая стоимость со скидкой должны вычисляться на ходу (в идеале - прямо при обращении к этим свойствам). Стоимость товара вычисляется по стоимости одной единицы, скидке на неё и количеству единиц.
как мне это применить к моим условиям?
Отредактировано py.user.next (Март 28, 2016 10:34:51)
Офлайн