2

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

4 回答 4

7

这是新手的常见问题,你是对的,有一种“更聪明/优雅的方式来做到这一点”。您使用像字典这样的数据结构来保存您的实例:

monsters = {}
monsters['Monster1'] = Monster()
monsters['Monster2'] = Monster()

因为字典的键是字符串,所以在运行时定义它们没有问题,但是你喜欢:

monster_name = "Monster" + str(monster_id)
monster_id += 1   
monsters[monster_name] = Monster()
于 2013-05-15T22:17:48.273 回答
5

我很确定你真的不想做你问怎么做的事情。

与其创建动态名称(以后将无法使用,因为您不知道它们的名称),不如使用数据结构来保存您的对象。例如, alist可以很容易地被一个整数索引,所以你的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()
于 2013-05-15T22:23:55.900 回答
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()

于 2013-05-15T22:24:08.550 回答
0

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

你没有。你很困惑。

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

您使用数据结构来跟踪您的对象。如果他们需要一个唯一的 id,最好的解决方案是在对象创建时分配一个 UUID。

于 2013-05-15T22:17:36.310 回答