是否可以使用input()函数让用户为对象输入变量?

2024-06-03 16:49:48 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个类和该类的一个对象:

class Rock:
    def __init__(self, name, group):
        self.name = name
        self.group = group

granite = Rock('Granite', 'Igneous')

现在让我们假设我想让用户输入一块石头,所以我有一行如下所示:

rock = input('Type the name of a rock: ')

根据用户输入的岩石,我希望它打印出一个字符串,如“花岗岩属于火成岩组”。我可以通过键入以下内容来实现此字符串:

print(granite.name + ' belongs to the ' + granite.group + ' group.')

然而,这只是给人一种选择的错觉,好像用户除了输入花岗岩之外还输入了任何岩石,他们会困惑于为什么只有花岗岩的输出。理想情况下,我希望能够键入以下内容:

print(rock.name + ' belongs to the ' + rock.group + ' group.')

无论用户输入什么,如果存在一个变量等于该字符串的对象,那么rock变量现在将等于所述rock对象。但是,这不起作用,因为用户输入的是字符串,而不是变量类。我可以通过添加if语句来解决这个问题,例如:

if rock == 'granite':
    rock = granite

但是,如果我这样做,那么我必须为我拥有的每个rock对象编写一个if语句,如果我有很多rock类,这将是非常低效的。所以我的问题是,有没有一种方法可以让用户输入一个实际的变量,而不仅仅是一个字符串?如果没有,请提供有关如何执行此操作的任何建议


Tags: the对象字符串用户nameself键入if
3条回答

把所有的石头都放在字典里,这样你就可以按名字查找它们了

class Rock:

    all_rocks = {}

    def __init__(self, name, group):
        self.name = name
        self.group = group
        self.all_rocks[name] = self

granite = Rock('Granite', 'Igneous')
rock_name = input("Type the name of a rock")
rock = Rock.all_rocks.get(rock_name)
print(rock.group)

详细阐述@Barmar的建议。使用字典:

rocks = {"granite": Rock('Granite', 'Igneous'), ....}
rock_name = input('Type the name of a rock: ')
rock = rocks[rock_name.lower()] # As long as it is a valid name

您甚至可能不再需要Rock.name

Python有一种检索dict中所有局部变量的方法:locals()

你可以做一些像rock = locals()[input("...")]

当然,您还需要处理KeyError

但是,由于该dict包含所有局部变量,因此只要您有另一个不是Rock实例,用户就可以选择这个不相关的变量。您还可以使用isinstance(..., Rock)处理这种情况

但所有这些都有点“黑客”,使用一个dict,将所有石头按名称映射,是更可取和安全的

相关问题 更多 >