Как вызвать метод класса для экземпляра имя которого получено с input()

class Robot:

    def __init__(self, name):
        self.name = name
        print(f'Рообот {self.name} создан')

    def jump(self):
        print(f'Робот {self.name} подпрыгнул')

robot1 = Robot('R2-D2')
robot2 = Robot('C-3PO')

jumper = input('Какой робот должен подпрыгнуть?')
jumper.jump()

Если ввести "robot1" должно вывестись "Робот R2-D2 подпрыгнул". Но возвращается ошибка: AttributeError: 'str' object has no attribute 'jump'.

Наверное глупый вопрос: какого типа данных название атрибута класса?


Ответы (5 шт):

Автор решения: Sherlock
class Robot:

    def __init__(self, name):
        self.name = name
        print(f'Робот {self.name} создан')

    def jump(self):
        print(f'Робот {self.name} подпрыгнул')

robot1 = Robot('R2-D2')
robot2 = Robot('C-3PO')

jumper = input('Какой робот должен подпрыгнуть?: ')

if jumper.lower() == 'r2-d2':
    robot1.jump()
if jumper.lower() == 'c-3po':
    robot2.jump()
else:
    print('Error')
→ Ссылка
Автор решения: S. Nick

Попробуйте так:

class Robot:
    def __init__(self, name):
        self.name = name
        print(f'Рообот {self.name} создан')

    def jump(self):
        print(f'\nРобот {self.name} подпрыгнул')

robot1 = Robot('R2-D2')
robot2 = Robot('C-3PO')

jumper = input('\nНаберите что должно подпрыгнуть R2-D2  или C-3PO: ') 
#jumper.jump()
if jumper == robot1.name:
    robot1.jump()
elif jumper == robot2.name:
    robot2.jump()
→ Ссылка
Автор решения: dIm0n

Почему бы не передать эту строку в конструктор робота? Не надо никаких проверок тогда, самое очевидное решение:

class Robot:
    def __init__(self, name):
        self.name = name
        print(f'Рообот {self.name} создан')

    def jump(self):
        print(f'Робот {self.name} подпрыгнул')

jumper = Robot(input('Какой робот должен подпрыгнуть?'))
jumper.jump()

Если вам нужна какая-то валидация для типа робота, то это должно происходить в объекте, а не вне его, сейчас вы принимаете произвольную строку.

→ Ссылка
Автор решения: Pavel Durmanov
In [15]: class Robot:
    ...:
    ...:     def __init__(self, name):
    ...:         self.name = name
    ...:         print(f'Рообот {self.name} создан')
    ...:
    ...:     def jump(self):
    ...:         print(f'Робот {self.name} подпрыгнул')
    ...:

In [16]: class RobotRegistry:
    ...:     robots = {}
    ...:
    ...:     @classmethod
    ...:     def register(cls, robot):
    ...:         cls.robots[robot.name] = robot
    ...:

In [17]: robot1 = Robot('R2-D2')
Рообот R2-D2 создан

In [18]: robot2 = Robot('C-3PO')
Рообот C-3PO создан

In [19]: RobotRegistry.register(robot1)

In [20]: RobotRegistry.register(robot2)

In [21]: robot_name = input("Enter robot name: ")
Enter robot name: R2-D2

In [22]: RobotRegistry.robots[robot_name].jump()
Робот R2-D2 подпрыгнул

Можно определить какие-то вспомогательные методы у RobotRegistry, чтобы явно не ходить в .robots.

По поводу подпрыгивания робота по имени переменной:

In [31]: locals()[input()].jump()
robot1
Робот R2-D2 подпрыгнул

Но так делать не рекомендуется.

→ Ссылка
Автор решения: blackRabbit
if jumper == str(robot1.name):
robot1.jump()
elif jumper == str(robot2.name):
robot2.jump()
else:
print("Такого робота нет")
→ Ссылка