Как вызвать метод класса для экземпляра имя которого получено с 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("Такого робота нет")