Python:基于变量的名称实例

时间:2013-05-15 22:13:52

标签: python

我对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()

所以问题是:如何在不知道实例运行时的名称的情况下创建类的实例?

我也想知道我是否正在努力工作,因为我做了一些愚蠢的事情,这是一种更聪明/更优雅的方式。在任何情况下都非常感谢所有帮助和意见。

4 个答案:

答案 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)

您有三种选择:

  1. 使用evaleval(monster_instance + ' = Monster()')。 eval基本上执行一个字符串。请注意,正如RichieHindle在评论中所说,eval不是理想的解决方案。它可能是一种选择,但这并不意味着它是推荐的。

  2. 使用数组/列表:monsters.append(Monster())。使用monsters = []初始化它。

  3. 使用字典:monsters[monster_instance: Monster()]monsters.update({monster_instance: Monster()})。使用monsters = dict()初始化它。

答案 3 :(得分:0)

  

所以问题是:如何在没有的情况下创建类的实例   知道实例运行前的名称吗?

你没有。你很困惑。

您只能在运行时创建实例,并且您不希望在其变量名中对有关该对象的任何信息进行编码,因为您的程序不会与变量名进行交互。

您可以使用数据结构来跟踪对象。如果他们需要具有唯一ID,则最佳解决方案是在对象创建时分配UUID。