Карма

Что нужно сделать

Один буддист-программист решил создать свой симулятор жизни, в котором нужно набрать 500 очков кармы (это константа), чтобы достичь просветления.

Каждый день вызывается специальная функция one_day(), которая возвращает количество кармы от 1 до 7 и может с вероятностью 1 к 10 выкинуть одно из исключений:

  • KillError;
  • DrunkError;
  • CarCrashError;
  • GluttonyError;
  • DepressionError.

Напишите такую программу. Функцию оберните в бесконечный цикл, выход из которого возможен только при накоплении кармы до уровня константы. Исключения обработайте и запишите в отдельный лог karma.log.

Что оценивается

  • Результат вычислений корректен.
  • Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
  • При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
    • Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
    • Для создания нового класса на основе уже существующего используется наследование.
  • Сообщения о процессе получения результата осмыслены и понятны для пользователя.
  • Переменные, функции и собственные методы классов имеют значащие имена, а не abcd.
  • Классы и методы/функции имеют прописанную документацию.
  • Названия используемых файлов соответствуют тем, которые написаны в задаче.
from random import randint, choice

class Karma:
    def __init__(self):
        self.__karma_points = 0
        self.__days_count = 0

    def one_day(self, value):
        self.set_day()
        try:
            if value == 10:
                exepts_tuple = ('KillError', 'DrunkEror', 'CarCrashError', 'GluttonyError', 'DepressionError')
                raise Exception(choice(exepts_tuple))
            else:
                point = randint(1, 7)
                self.set_karma_point(point)
        except Exception as exc:
            with open('karma.log', 'a', encoding='UTF-8') as file:
                file.writelines(f'\nДень {self.get_day()}, ошибка: {exc}')

    def set_karma_point(self, point):
        self.__karma_points += point

    def get_karma(self):
        return self.__karma_points

    def get_day(self):
        return self.__days_count

    def set_day(self):
        self.__days_count += 1

    def toconstant(self):
        while True:
            finish = self.get_karma()
            if finish >= 500:
                print(f'День {self.get_day()}, набрано {finish} очков кармы.')
                break
            else:
                value = randint(1, 10)
                self.one_day(value)

gokarma = Karma()
gokarma.toconstant()