Налоги

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

Реализуйте иерархию классов, описывающих имущество налогоплательщиков. Она должна состоять из базового класса Property и производных от него классов ApartmentCar и CountryHouse.

Базовый класс должен иметь атрибут worth (стоимость), который передаётся в конструктор, и метод расчёта налога, переопределённый в каждом из производных классов. Налог на квартиру вычисляется как 1/1000 её стоимости, на машину — 1/200, на дачу — 1/500.

Каждый дочерний класс должен иметь конструктор с одним параметром, передающий свой параметр конструктору базового класса.

Разработайте интерфейс программы. Пусть она запрашивает у пользователя количество его денег и стоимость имущества, а затем выдаёт налог на соответствующее имущество и показывает, сколько денег ему не хватает (если это так).

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

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

class Unit:
    def __init__(self, name):
        self.name = name
        self.health = 100
        self.__power = 20
        self.__dead = False

    def __str__(self):
        return f'Юнит {self.name} имеет {self.health} HP.'


    def damage(self, obj):
        print(f'\n{self.name} нанес урон {obj.name}.')
        obj.health -= self.get_power()
        print(obj.__str__())
        obj.set_dead()

    def get_power(self):
        return self.__power

    def set_dead(self):
        if self.health <= 0:
            self.__dead = True

    def get_dead(self):
        return self.__dead

class Game:
    def __init__(self):
        self.__count = 0
        self.war1 = Unit('Викинг')
        self.war2 = Unit('Крестьянин')

    def battle(self):
        while True:
            if self.get_count() == 0:
                self.present()
                self.set_count()
            hit = randint(1, 2)
            if hit == 1:
                self.war1.damage(self.war2)
                if self.war2.get_dead() == True:
                    self.finish(self.war1)
                    break
            else:
                self.war2.damage(self.war1)
                if self.war1.get_dead() == True:
                    self.finish(self.war2)
                    break

    def present(self):
        print('\t\t\tДа начнется великая битва!')

    def set_count(self):
        self.__count += 1

    def get_count(self):
        return self.__count

    def finish(self, obj):
        print(f'Победил {obj.name}. Славная победа!')

game = Game()
game.battle()