正确使用super()到.pop()关闭每个子实例的父类列表中的名称

时间:2014-11-05 04:33:18

标签: python oop inheritance design-patterns

我正在构建一个游戏,其中我创建了一个ComputerPlayer()类的Players()类。我在Players()类中使用了一个名单列表,用于子类中的构造函数,每次实例化时为每个计算机播放器随机获取一个名称,并pop()将其关闭,因此名称可以'被分配两次。代码如下:

class Players(object):

    names = ['Carl', 'James', 'Bob', 'Jamal', 'Kris', 'Andy', 'Rupert', 'Gerald', 'Pat',
             'Gloria', 'Hannah', 'Priscilla', 'Sarah', 'Silvia']

class ComputerPlayer(Players):

    def ___init___(self):
        self.name = super(ComputerPlayer, self).names.pop(randint(0, len(super(ComputerPlayer, self).names) - 1))

所以我要做的是为ComputerPlayer()类中的每个计算机化播放器实例化一个新的Game()对象,如果我总是想要相同数量的玩家,我可以很容易地做到:< / p>

class Game(object):

    def ___init___(self):
        self.player1 = ComputerPlayer()
        self.player2 = ComputerPlayer()
        self.player3 = ComputerPlayer()

或者如果我希望人类玩家能够选择他们想要对抗多少计算机对手,我可以将参数传递给Game()并执行:

def __init___(self, num):
    self.players = []
    for x in range(0,num):
        self.players.append(ComputerPlayer())

当我第一次开始这个问题时,我想知道是否有办法访问ComputerPlayer()的每个实例并引用它的随机分配名称,但正如我写的那样,我意识到没有真正的好处要做到这一点,它可能会使事情变得不必要地复杂化;这些名字只是为了向人类玩家展示,让游戏感觉更“人性化”。

但是,虽然我知道我在super()课程中正确使用ComputerPlayer() ,但它是否必然是首选的方式它?使用对Players().names的直接引用也很有用,它会缩短那段丑陋的代码。

Game()类将拥有控制游戏逻辑的主要方法,因此创建我的个人计算机播放器的正确类是什么?

任何其他意见,问题或建议将不胜感激。这场比赛将是“街头骰子”顺便说一句。谢谢!

1 个答案:

答案 0 :(得分:1)

你听起来好像名字只是用于电脑播放器。 那么为什么不将它放在ComputerPlayer类中并跳过使用super?

如果您创建的计算机播放器数量超过len(名称),则代码将出现错误