Python变量范围混乱

时间:2015-02-09 03:57:31

标签: python

我正在设置一个简单的游戏,并且无法从Player类实例访问Game类实例:

class Player():
    global game
    print game.board  # NameError: name 'game' is not defined


class Game():
    def __init__(self):
        self.board = range(9)

    p = Player()


if __name__ == "__main__":
    game = Game()

我确信这对我来说是一个简单的修复/误解,但我错过了什么?

2 个答案:

答案 0 :(得分:3)

解释器将首先尝试创建类Player,然后创建类Game,然后运行代码。因此,它会在Player执行之前生成类game = Game(),因此此时没有变量game并导致您的错误。

答案 1 :(得分:2)

更好的方法是使用DI(依赖注入),以便在初始化时将Game对象“传递”到Player

class Player(object):
    def __init__(self, game):
        self.game = game  

    def print_player(self):
        print self.game.board


class Game(object):
    def __init__(self):
        self.board = range(9)


if __name__ == "__main__":
    game = Game()
    player = Player(game)
    player.print_player() # prints [0, 1, 2, 3, 4, 5, 6, 7, 8]

依赖globals()not a good practice,因为它依赖于执行顺序(就像你的情况一样),使得代码的可读性降低(你必须从一个地方跳到另一个地方而不是阅读它“流利地”,以及它可能引入副作用。

糟糕的做法(等等。不要在家里做!):
以下代码(虽然这是一个不好的做法)将起作用,因为当您使用globals()时减速的顺序是有意义的:game = Game()应该在之前声明 / em> class Player,以便在那里使用:

class Game():
    def __init__(self):
        self.board = range(9)

game = Game()

class Player():
    global game
    print game.board 

p = Player() # prints [0, 1, 2, 3, 4, 5, 6, 7, 8]