Уведомления

Группа в Telegram: @pythonsu

#1 Март 27, 2016 16:10:36

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

метод __str__

Здравствуйте! Помогите пожалуйста со следующей проблемой. Есть 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

Мне необходимо в классе Order определить метод __str__, который выводит содержимое заказа в формате: Имя
товара - Количество товара - Стоимость. Использовать groupby() из модуля itertools. Подскажите как это сделать?

Отредактировано megoloman (Март 27, 2016 19:02:18)

Офлайн

#2 Март 27, 2016 17:44:04

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

метод __str__

megoloman
что за бред вы пишете. Где в классе Order имя заказа и его количество? Что собрались выводить? Зачем вы наследуете его от list ? от списка! Ну и где вы собрались использовать groupby ?
Я надеюсь этот код исключительно учебный,а не ,хотя бы с намеком, на реальный.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Март 27, 2016 17:46:21

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

метод __str__

Это тестовое задание:
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)

Офлайн

#4 Март 28, 2016 04:29:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

метод __str__

>>> 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
>>>



Офлайн

#5 Март 28, 2016 10:16:24

megoloman
Зарегистрирован: 2015-10-26
Сообщения: 113
Репутация: +  0  -
Профиль   Отправить e-mail  

метод __str__

спасибо!

Отредактировано megoloman (Март 28, 2016 10:31:55)

Офлайн

#6 Март 28, 2016 10:34:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

метод __str__

megoloman
как мне это применить к моим условиям?
Ну, у тебя товар должен храниться в заказе в том же виде, в котором и добавляется. А общая стоимость или общая стоимость со скидкой должны вычисляться на ходу (в идеале - прямо при обращении к этим свойствам). Стоимость товара вычисляется по стоимости одной единицы, скидке на неё и количеству единиц.



Отредактировано py.user.next (Март 28, 2016 10:34:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version