Что нужно сделать
Реализуйте иерархию классов, описывающих имущество налогоплательщиков. Она должна состоять из базового класса Property
и производных от него классов Apartment
, Car
и CountryHouse
.
Базовый класс должен иметь атрибут worth (стоимость), который передаётся в конструктор, и метод расчёта налога, переопределённый в каждом из производных классов. Налог на квартиру вычисляется как 1/1000 её стоимости, на машину — 1/200, на дачу — 1/500.
Каждый дочерний класс должен иметь конструктор с одним параметром, передающий свой параметр конструктору базового класса.
Разработайте интерфейс программы. Пусть она запрашивает у пользователя количество его денег и стоимость имущества, а затем выдаёт налог на соответствующее имущество и показывает, сколько денег ему не хватает (если это так).
Что оценивается
- Результат вычислений корректен.
input
содержит корректные приглашения для ввода.- Модели реализованы в стиле ООП, основной функционал описан в методах классов и в отдельных функциях.
- При написании классов соблюдаются основные принципы ООП: инкапсуляция, наследование и полиморфизм.
- Для получения и установки значений у приватных атрибутов используются сеттеры и геттеры.
- Для создания нового класса на основе уже существующего используется наследование.
- Сообщения о процессе получения результата осмыслены и понятны для пользователя.
- Переменные, функции и собственные методы классов имеют значащие имена, а не
a
,b
,c
,d
. - Классы и методы/функции имеют прописанную документацию.
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()