假设我有一个类和该类的一个对象:
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类,这将是非常低效的。所以我的问题是,有没有一种方法可以让用户输入一个实际的变量,而不仅仅是一个字符串?如果没有,请提供有关如何执行此操作的任何建议
把所有的石头都放在字典里,这样你就可以按名字查找它们了
详细阐述@Barmar的建议。使用字典:
您甚至可能不再需要
Rock.name
Python有一种检索dict中所有局部变量的方法:
locals()
你可以做一些像
rock = locals()[input("...")]
当然,您还需要处理
KeyError
但是,由于该dict包含所有局部变量,因此只要您有另一个不是的
Rock
实例,用户就可以选择这个不相关的变量。您还可以使用isinstance(..., Rock)
处理这种情况但所有这些都有点“黑客”,使用一个dict,将所有石头按名称映射,是更可取和安全的
相关问题 更多 >
编程相关推荐