实例化列表中的一组类



我在Python上相对较新,使用2.7。这似乎应该有效,但事实并非如此。

我想创建一个具有多个类播放器实例的类游戏实例。用户实例化 Game,指定玩家数量,例如,game = Game(3)。我想调用播放器实例 p1、p2 等。

我从一个创建名称列表的方法开始

def getPlayerList(self):
self.playerlist = []
for p in range (self.numplayers):
self.playerlist.append("p" + str(p+1))
return self.playerlist

对于 3 个玩家,这将生成一个包含 3 个字符串的列表:

self.playerlist = [p1, p2, p3]

现在我想创建 3 个播放器实例,分配给 p1、p2 和 p3。这似乎是最简单的方法:

def initPlayers(self):
self.getPlayerList()
for i in self.playerlist:
i = Player(i)  # doesn't work
return

此代码通过播放器实例化循环 3 次,但"i"不会替换为字符串 p1、p2 和 p3。 所以,例如

p1.name

未定义。

就此而言,也是如此

i.name

如果我用这个 for 循环测试其他代码,它会与预期的替换一起使用。例如:

for i in self.playerlist:
print i
p1
p2
p3

i = Player(i)

不会变成实例化

p1 = Player("p1")

我不知道为什么这不起作用,也不知道我应该怎么做,谢谢。

我认为你把这复杂化了。尝试动态生成变量名称通常是一个坏主意;请改用字典:

players = {i:Player(i) for i in self.playerlist}

或者,更简单的列表,您可以在其中按索引访问玩家:

players = [Player(i) for i in self.playerlist]

你在当前循环中所做的只是将一个新的Player对象分配给for循环变量i,然后在循环迭代时立即丢弃该对象。

打印有点棘手,因为它可以隐藏以相同方式打印的不同类型的对象之间的差异。

self.playerlist的内容不是p1p2p3,而是"p1""p2""p3"。换句话说,您的列表包含三个字符串。

你真的会期待吗

i = "p1"
i = 2

将 2 分配给新变量p1或仅将新值2分配给变量i

在运行时创建"新变量"在Python中是可能的(例如使用globals()[i]=2),但很少需要。仅使用字典或列表而不是使用变量是一个更好的选择:

self.players = [Player(i) for i in range(3)]

然后例如,您不使用self.players[0].draw()而不是p1.draw(),您将获得极其重要的优势,您也可以简单地说self.players[i].draw()访问通用i-th播放器。

最新更新