Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 28, 2020 11:43:02

aidar4ik
Зарегистрирован: 2020-04-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

Всем привет!
Изучаю ООП, есть такая задача

Напишите класс 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

Офлайн

#2 Апрель 28, 2020 12:12:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

aidar4ik
Я написал структуру классов.
Класс Tool надо написать так, чтобы переменная strength была переменной экземпляра. Это нужно, чтобы в каждом инструменте при его создании оказывалась своя сотня единиц. Для этого нужно использовать метод __init__() у класса Tools. А переменная класса, как сделано у тебя, является общей для всех, поэтому сотня разделится между всеми инструментами.

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

А с точки зрения ООП ты должен использовать агрегацию. Инструмент подключается к роботу и отключается от него. При этом если робот удаляется, инструмент остаётся существовать.



Отредактировано py.user.next (Апрель 28, 2020 12:13:39)

Офлайн

#3 Апрель 28, 2020 12:51:28

aidar4ik
Зарегистрирован: 2020-04-28
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

про агрегацию не знаю…..
а вы не могли бы примерно описать как будет выглядеть метод setup_tool()
у робота?

Офлайн

#4 Апрель 28, 2020 14:33:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

Код не полный, так как ты сам должен делать, чтобы научиться. А задание элементарное.

  
>>> 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)

Офлайн

#5 Май 1, 2020 03:11:37

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

Добрый вечер! Попробовал реализовать задачу ТС и не могу понять, почему у меня в методе 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)

Офлайн

#6 Май 1, 2020 03:42:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

Roiser
почему у меня в методе recharge печатает None
Потому что self.show_stamina() возвращает значение None. Поэтому после вызова выполняется print(None).



Офлайн

#7 Май 1, 2020 13:55:15

Roiser
Зарегистрирован: 2020-04-26
Сообщения: 14
Репутация: +  1  -
Профиль   Отправить e-mail  

Программа описывающая роботов рабочих

py.user.next
Потому что self.show_stamina() возвращает значение None. Поэтому после вызова выполняется print(None).
Точно! Спасибо!

Отредактировано Roiser (Май 1, 2020 13:55:41)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version