【问题标题】:Instantiating a set of classes from a list从列表中实例化一组类
【发布时间】:2014-03-16 11:04:59
【问题描述】:

我对 Python 比较陌生,使用的是 2.7。这似乎应该有效,但实际上并没有。

我想创建一个包含多个 Player 类实例的 Game 类实例。用户实例化 Game,指定玩家数量,例如,game = 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 次,但“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")

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

【问题讨论】:

    标签: python class oop python-2.7 instantiation


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 没错。在这种情况下,一个列表也足够了:p = [Player(i) for i in xrange(n)]。然后像p[0]p[1] 等一样使用它们。
    • 我已经有列表版了;简单地使用xrange 不会给出正确的玩家名称。
    【解决方案2】:

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

    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 播放器。

    【讨论】:

      猜你喜欢
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      • 2016-02-24
      相关资源
      最近更新 更多