/
Carton
/
python-course-tasks
Обзор
Документация
Войти
/
Carton
/
python-course-tasks
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
task_10_02_03/deposit.py
216 строк
10 KB
Yuri Petrov
+ перенос заданий в отдельный репозиторий
02 июл 2020, 02:05
02 июл 2020, 02:05
5312992
Код
Авторство
О чём код?
# Программирование на языке высокого уровня (Python). # https://www.yuripetrov.ru/edu/python # Задание task_10_02_03. # # Выполнил: Фамилия И.О. # Группа: !!! # E-mail: !!! class TimeDeposit: """Абстрактный класс - срочный вклад. https://ru.wikipedia.org/wiki/Срочный_вклад. Поля: - self.name (str): наименование; - self._interest_rate (float): процент по вкладу (0; 100]; - self._period_limit (tuple (int, int)): допустимый срок вклада в месяцах [от; до); - self._sum_limit (tuple (float, float)): допустимая сумма вклада [от; до). Свойства: - self.currency (str): знак/наименование валюты. Методы: - self._check_self(initial_sum, period): проверяет соответствие данных ограничениям вклада; - self.get_profit(initial_sum, period): возвращает прибыль по вкладу; - self.get_sum(initial_sum, period): возвращает сумму по окончании вклада. """ def __init__(self, name, interest_rate, period_limit, sum_limit): """Инициализировать атрибуты класса.""" raise NotImplementedError # Уберите raise и добавьте необходимый код # Проверить значения self._check_self() def __str__(self): """Вернуть строкое представление депозита. Формат вывода: Наименование: Срочный Вклад Валюта: руб. Процентная ставка: 5 Срок (мес.): [6; 18) Сумма: [1,000; 100,000) """ raise NotImplementedError # Уберите raise и добавьте необходимый код @property def currency(self): return "руб." # Не изменяется def _check_self(self): """Проверить, что данные депозита являются допустимыми.""" assert 0 < self._interest_rate <= 100, \ "Неверно указан процент по вкладу!" assert 1 <= self._period_limit[0] < self._period_limit[1], \ "Неверно указаны ограничения по сроку вклада!" assert 0 < self._sum_limit[0] <= self._sum_limit[1], \ "Неверно указаны ограничения по сумме вклада!" def _check_user_params(self, initial_sum, period): """Проверить, что данные депозита соответствуют его ограничениям.""" is_sum_ok = self._sum_limit[0] <= initial_sum < self._sum_limit[1] is_period_ok = self._period_limit[0] <= period < self._period_limit[1] assert is_sum_ok and is_period_ok, "Условия вклада не соблюдены!" def get_profit(self, initial_sum, period): """Вернуть прибыль по вкладу вклада клиента. Параметры: - initial_sum (float): первоначальная сумма; - period (int): количество месяцев размещения вклада. Формула: первоначальная_сумма * % / 100 * период / 12 """ # Проверить, укладывается ли вклад в ограничения self._check_user_params(initial_sum, period) # Выполнить расчет return initial_sum * self._interest_rate / 100 * period / 12 def get_sum(self, initial_sum, period): """Вернуть сумму вклада клиента после начисления прибыли. Параметры: - initial_sum (float): первоначальная сумма; - period (int): количество месяцев размещения вклада. """ # Проверить, укладывается ли вклад в ограничения return initial_sum + self.get_profit(initial_sum, period) class BonusTimeDeposit(TimeDeposit): """Cрочный вклад c получением бонуса к концу срока вклада. Бонус начисляется как % от прибыли, если вклад больше определенной суммы. Атрибуты: - self._bonus (dict ("percent"=int, "sum"=float)): % от прибыли, мин. сумма; """ def __init__(self, name, interest_rate, period_limit, sum_limit, bonus): """Инициализировать атрибуты класса.""" raise NotImplementedError # Уберите raise и добавьте необходимый код super().__init__(name, interest_rate, period_limit, sum_limit) def __str__(self): """Вернуть строкое представление депозита. К информации о родителе добавляется информацию о бонусе. Формат вывода: Наименование: Бонусный Вклад Валюта: руб. Процентная ставка: 5 Срок (мес.): [6; 18) Сумма: [1,000; 100,000) Бонус (%): 5 Бонус (мин. сумма): 2,000 """ raise NotImplementedError # Уберите raise и добавьте необходимый код def _check_self(self): """Проверить, что данные депозита являются допустимыми. Дополняем родительский метод проверкой бонуса. """ raise NotImplementedError # Уберите raise и добавьте необходимый код def get_profit(self, initial_sum, period): """Вернуть прибыль по вкладу вклада клиента. Параметры: - initial_sum (float): первоначальная сумма; - period (int): количество месяцев размещения вклада. Формула: - прибыль = сумма * процент / 100 * период / 12 Для подсчета прибыли используется родительский метод. Далее, если первоначальная сумма > необходимой, начисляется бонус. """ raise NotImplementedError # Уберите raise и добавьте необходимый код class CompoundTimeDeposit(TimeDeposit): """Cрочный вклад c ежемесячной капитализацией процентов.""" def __str__(self): """Вернуть строкое представление депозита. К информации о родителе добавляется информация о капитализации. Формат вывода: Наименование: Вклад с Капитализацией Валюта: руб. Процентная ставка: 5 Срок (мес.): [6; 18) Сумма: [1,000; 100,000) Капитализация % : Да """ raise NotImplementedError # Уберите raise и добавьте необходимый код def get_profit(self, initial_sum, period): """Вернуть прибыль по вкладу вклада клиента. Параметры: - initial_sum (float): первоначальная сумма; - period (int): количество месяцев размещения вклада. Родительский метод для подсчета прибыли использовать не нужно, переопределив его полностью - расчет осуществляется по новой формуле. Капитализация процентов осуществляется ежемесячно. Нужно не забыть про самостоятельный вызов проверки параметров. Формула: первоначальная_сумма * (1 + % / 100 / 12) ** период - первоначальная_сумма """ raise NotImplementedError # Уберите raise и добавьте необходимый код # --- deposits_data = dict(interest_rate=5, period_limit=(6, 18), sum_limit=(1000, 100000)) # Список имеющихся депозитов deposits = ( TimeDeposit("Сохраняй", interest_rate=5, period_limit=(6, 18), sum_limit=(1000, 100000)), BonusTimeDeposit("Бонусный 2", **deposits_data, bonus=dict(percent=5, sum=2000)), CompoundTimeDeposit("С капитализацией", **deposits_data) raise NotImplementedError # Уберите raise и добавьте несколько вкладов )