2014-02-17 41 views
1

我在Python中比较新,使用的是2.7。这似乎是应该起作用的,但不是。从列表中实例化一组类

我想用类Player的多个实例创建一个类Game的实例。用户实例化游戏,指定多个玩家,例如游戏=游戏(3)。我想打电话给Player实例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 

此代码回路通播放器实例3倍,但“我”没有得到处理字符串P1,P2和P3所取代。因此,例如,

p1.name 

是未定义的。

对于这个问题,所以是

i.name 

如果我测试的其他代码与for循环,它的工作原理与预期替换。例如:

for i in self.playerlist: 
    print i 

p1 
p2 
p3 

i = Player(i) 

不会变成实例

p1 = Player("p1") 

我想不通为什么没有这个工作,不知道如何否则我应该这样做,谢谢。

回答

3

我觉得你太过复杂了。试图动态生成变量名通常是一个坏主意;使用字典来代替:

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

甚至更​​简单,一个列表,在这里你可以通过索引来访问玩家:

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

所有你在你的电流回路正在做的是分配新Player对象for循环变量i,然后在循环迭代时立即丢弃该变量。

+0

没错。在这种情况下,一个列表也足够了:'p = [Player(i)for i in xrange(n)]'。然后像'p [0]','p [1]'等一样使用它们。 – Sahand

+0

我已经有了列表版本;只需使用'xrange'就不会给出正确的玩家名字。 – jonrsharpe

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-第一位玩家。没问题。