我对Python和编程很新。
我正在制作一个基于终端的游戏作为练习项目。游戏将是一系列的房间和怪物。我的计划是制作这些课程的怪物和房间实例。我在整个游戏中创建了其中的一些,其中许多是基于玩家行为而动态创建的。
在创建新的怪物和房间时,我现在很难事先知道他们的名字。像这样:
class Monster(object):
pass
Monster1 = Monster(something)
必须知道运行前的实例名称似乎是一个笨拙的解决方案。我认为让变量跟踪怪物数量会更容易,然后动态创建实例名称。因此创建的第一个怪物实例将自动为Monster1,下一个将是Monster2等。
这样的事情:
class Monster(object):
pass
monster_id = 0
def 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()
所以问题是:如何在不知道实例运行时的名称的情况下创建类的实例?
我也想知道我是否正在努力工作,因为我做了一些愚蠢的事情,这是一种更聪明/更优雅的方式。在任何情况下都非常感谢所有帮助和意见。
答案 0 :(得分:7)
这是一个来自新手的常见问题,你是对的,有一种“更聪明/更优雅的方式”。您使用像字典这样的数据结构来保存您的实例:
monsters = {}
monsters['Monster1'] = Monster()
monsters['Monster2'] = Monster()
因为字典的键是字符串,所以在运行时定义它们没有问题,但是你喜欢:
monster_name = "Monster" + str(monster_id)
monster_id += 1
monsters[monster_name] = Monster()
答案 1 :(得分:5)
我很确定你真的不想做你想要怎么做的事。
您应该使用数据结构来保存对象,而不是创建动态名称(以后您将无法使用它,因为您不知道它们的名称)。例如,list
可以很容易地用整数索引,因此monster1
变量可以变为monsters[1]
:
# create the list of monsters
monsters = [Monster(1), Monster(2), Monster(3)] # or whatever parameters
# then later, use it
monster[1].eat_player()
或者不是提前设置整个列表并使用显式索引,您可以使列表动态化并迭代它:
# setup
monsters = [] # empty list
# later, dynamically add monsters
monster_spawn_timer -= 1
if monster_spawn_timer < 0:
monster_spawn_timer += MONSTER_SPAWN_INTERVAL
monsters.append(Monster())
# and at some other point in your main loop, you can iterate over the monsters:
for m in monsters:
m.do_stuff()
答案 2 :(得分:1)
您有三种选择:
使用eval
:eval(monster_instance + ' = Monster()')
。 eval基本上执行一个字符串。请注意,正如RichieHindle在评论中所说,eval
不是理想的解决方案。它可能是一种选择,但这并不意味着它是推荐的。
使用数组/列表:monsters.append(Monster())
。使用monsters = []
初始化它。
使用字典:monsters[monster_instance: Monster()]
或monsters.update({monster_instance: Monster()})
。使用monsters = dict()
初始化它。
答案 3 :(得分:0)
所以问题是:如何在没有的情况下创建类的实例 知道实例运行前的名称吗?
你没有。你很困惑。
您只能在运行时创建实例,并且您不希望在其变量名中对有关该对象的任何信息进行编码,因为您的程序不会与变量名进行交互。
您可以使用数据结构来跟踪对象。如果他们需要具有唯一ID,则最佳解决方案是在对象创建时分配UUID。