我正在设置一个简单的游戏,并且无法从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()
我确信这对我来说是一个简单的修复/误解,但我错过了什么?
答案 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]