我对Python和一般编程还是很陌生。我正在将基于终端的游戏作为练习项目。游戏将包含一系列房间和怪物。我的计划是制作这些类的怪物和房间实例。我将在整个游戏中创建其中的一些,其中许多是根据玩家的动作即时创建的。当创建新的怪物和房间时,我目前坚持事先知道它们的名字。像这样:class Monster(object): passMonster1 = Monster(something)在运行前必须知道实例名称似乎是一个笨拙的解决方案。我当时以为,有一个变量来跟踪怪物的数量,然后动态创建实例名称会更容易。这样创建的第一个怪物实例将自动成为Monster1,下一个实例将成为Monster2,依此类推。像这样的东西:class Monster(object): passmonster_id = 0def createMonster(monster_id)monster_instance = "Monster" + str(monster_id)monster_id += 1 # The following is where i'm stuck. Basically I want to have the instance name be equal to the content of monster_instance(monster_instance) = Monster()因此,问题是:如何在运行时不知道实例名称的情况下创建类的实例?我还想知道我是否很难让它正常工作,因为我做的事情很愚蠢,而这是一种更聪明/更优雅的方法。在任何情况下,所有帮助和投入都将不胜感激。
3 回答

慕标琳琳
TA贡献1830条经验 获得超9个赞
这是新手的常见问题,对了,这是一种“更聪明/更优雅的方式”。您使用像字典这样的数据结构来保存您的实例:
monsters = {}
monsters['Monster1'] = Monster()
monsters['Monster2'] = Monster()
因为字典的键是字符串,所以在运行时定义它们没有问题,但是您喜欢:
monster_name = "Monster" + str(monster_id)
monster_id += 1
monsters[monster_name] = Monster()

莫回无
TA贡献1865条经验 获得超7个赞
您有三种选择:
用途
eval
:eval(monster_instance + ' = Monster()')
。eval基本执行一个字符串。请注意,正如RichieHindle在评论中所说,这eval
不是理想的解决方案。它可能是一个选项,但这并不意味着建议您这样做。使用数组/列表:
monsters.append(Monster())
。使用初始化它monsters = []
。使用字典:
monsters[monster_instance: Monster()]
或monsters.update({monster_instance: Monster()})
。使用初始化它monsters = dict()
。
添加回答
举报
0/150
提交
取消