Найти - Пользователи
Полная версия: Программа описывающая роботов рабочих
Начало » Python для новичков » Программа описывающая роботов рабочих
1
aidar4ik
Всем привет!
Изучаю ООП, есть такая задача

Напишите класс 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
py.user.next
aidar4ik
Я написал структуру классов.
Класс Tool надо написать так, чтобы переменная strength была переменной экземпляра. Это нужно, чтобы в каждом инструменте при его создании оказывалась своя сотня единиц. Для этого нужно использовать метод __init__() у класса Tools. А переменная класса, как сделано у тебя, является общей для всех, поэтому сотня разделится между всеми инструментами.

Это к ООП не относится. В питоне свой стиль использования классов, отличающийся от других языков, поэтому это просто надо знать из книг по питону.

А с точки зрения ООП ты должен использовать агрегацию. Инструмент подключается к роботу и отключается от него. При этом если робот удаляется, инструмент остаётся существовать.
aidar4ik
про агрегацию не знаю…..
а вы не могли бы примерно описать как будет выглядеть метод setup_tool()
у робота?
py.user.next
Код не полный, так как ты сам должен делать, чтобы научиться. А задание элементарное.
  
>>> 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.
>>>
Roiser
Добрый вечер! Попробовал реализовать задачу ТС и не могу понять, почему у меня в методе 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
Подзарядка не требуется
py.user.next
Roiser
почему у меня в методе recharge печатает None
Потому что self.show_stamina() возвращает значение None. Поэтому после вызова выполняется print(None).
Roiser
py.user.next
Потому что self.show_stamina() возвращает значение None. Поэтому после вызова выполняется print(None).
Точно! Спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB