Форум сайта python.su
0
Всем привет!
Изучаю ООП, есть такая задача
Напишите класс Tool - Инструмент. Каждый инструмент имеет запас прочности - 100 единиц, который уменьшается на 10 единиц, когда им работают.
Также у инструмента есть метод action(), который имитирует работу инструмента. По умолчанию он только уменьшает прочность инструмента при каждом вызове.
Наследуйте от класса Tool классы конкретных инструментов: Saw (пила), Axe (топор), Drill (дрель), Hammer (молоток), Screwdriver (шуруповёрт).
Переопределите их методы action(), чтобы они вызывали метод родителя, а также выводили сообщение, имитирующее действие этого конкретного инструмента. Например, пила может выводить сообщение “ZZZZZZZZZ”.
Напишите класс Robot.
По умолчанию у робота нет инструмента (в конструкторе нужно явно прописать это).
У робота должно быть три метода:
setup_tool() - установить инструмент - устанавливает указанный инструмент.
drop_tool() - снять инструмент - роняет текущий инструмент.
action() - выполнить действие. Метод должен вызвать action() того инструмента, который установлен на роботе. Если инструмент отсутствует или сломался, метод должен выводить соответствующие сообщения об ошибках.
Я написал структуру классов.
Не понимаю теперь, как одеть роботу инструмент?
Именно что должен делать метод setup_tool()?
class Tools: strength = 100 def action(self): Tools.strength -= 10 class Saw(Tools): def action(self): super().action() print("БРБРБРБР") class Axe(Tools): def action(self): super().action() print("бух бух") class Drill(Tools): def action(self): super().action() print("бзбзбз") class Hummer(Tools): def action(self): super().action() print("бах бах") class Screwdriver(Tools): def action(self): super().action() print("псссс") class Robot: def __init__(self, tool=None): self.tool = tool def setup_tool(self): pass def drop_tool(self): pass def action(self): pass
Офлайн
857
aidar4ikКласс Tool надо написать так, чтобы переменная strength была переменной экземпляра. Это нужно, чтобы в каждом инструменте при его создании оказывалась своя сотня единиц. Для этого нужно использовать метод __init__() у класса Tools. А переменная класса, как сделано у тебя, является общей для всех, поэтому сотня разделится между всеми инструментами.
Я написал структуру классов.
Отредактировано py.user.next (Апрель 28, 2020 12:13:39)
Офлайн
0
про агрегацию не знаю…..
а вы не могли бы примерно описать как будет выглядеть метод setup_tool()
у робота?
Офлайн
857
Код не полный, так как ты сам должен делать, чтобы научиться. А задание элементарное.
>>> class Tool: ... pass ... >>> class Hammer(Tool): ... def action(self): ... print("I'm a hummer.") ... >>> class Axe(Tool): ... def action(self): ... print("I'm an axe.") ... >>> class Robot: ... def __init__(self): ... self.tool = None ... def setup_tool(self, tool): ... self.tool = tool ... def drop_tool(self): ... self.tool = None ... def action(self): ... self.tool.action() ... >>> robot = Robot() >>> robot.setup_tool(Axe()) >>> robot.action() I'm an axe. >>> robot.setup_tool(Hammer()) >>> robot.action() I'm a hummer. >>>
>>> class Tool: ... pass ... >>> class Hammer(Tool): ... def action(self): ... print("I'm a hummer.") ... >>> class Axe(Tool): ... def action(self): ... print("I'm an axe.") ... >>> class Robot: ... def __init__(self): ... self.tool = None ... def setup_tool(self, tool): ... self.tool = tool ... def drop_tool(self): ... self.tool = None ... def action(self): ... self.tool.action() ... >>> robot_a = Robot() >>> >>> hammer_x = Hammer() >>> robot_a.setup_tool(hammer_x) >>> robot_a.action() I'm a hummer. >>> robot_a.drop_tool() >>> >>> # Благодаря отношению агрегации мы можем использовать одну и ту же ... # кувалду повторно и передать её другому роботу ... robot_b = Robot() >>> robot_b.setup_tool(hammer_x) >>> robot_b.action() I'm a hummer. >>>
Отредактировано py.user.next (Апрель 28, 2020 23:40:17)
Офлайн
1
Добрый вечер! Попробовал реализовать задачу ТС и не могу понять, почему у меня в методе recharge печатает None (помимо нужного):
class Robot(): def __init__(self): self.stamina = 90 def show_stamina(self): print("Текущий заряд {0}%".format(self.stamina)) def recharge(self): if self.stamina == 100: print(self.show_stamina()) print("Подзарядка не требуется") else: print(self.show_stamina()) print("Подзарядка...") self.stamina = 100 print(self.show_stamina()) R2 = Robot() R2.show_stamina() print() R2.recharge() print() R2.recharge()
Текущий заряд 90%
Текущий заряд 90%
None
Подзарядка…
Текущий заряд 100%
None
Текущий заряд 100%
None
Подзарядка не требуется
Отредактировано Roiser (Май 1, 2020 03:21:09)
Офлайн
857
RoiserПотому что self.show_stamina() возвращает значение None. Поэтому после вызова выполняется print(None).
почему у меня в методе recharge печатает None
Офлайн
1
py.user.nextТочно! Спасибо!
Потому что self.show_stamina() возвращает значение None. Поэтому после вызова выполняется print(None).
Отредактировано Roiser (Май 1, 2020 13:55:41)
Офлайн