从列表中实例化一组类

时间:2014-02-17 08:36:33

标签: python class oop python-2.7 instantiation

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

我想用多个Player类实例创建一个类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个Player实例,分配给p1,p2和p3。这似乎是最简单的方法:

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

此代码通过Player实例化循环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")

我无法弄清楚为什么这不起作用,也不知道我应该怎么做,谢谢。

2 个答案:

答案 0 :(得分:3)

我认为你过于复杂了。试图动态生成变量名称通常是一个坏主意;改为使用字典:

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

或者,甚至更简单的一个列表,您可以通过索引访问玩家:

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

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

答案 1 :(得分:1)

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

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)]

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