我来自C ++背景,如果没有python中的整个指针概念,我有点迷失。或者至少它还不清楚。 例如,我想在Python中使用OOP创建一个刻度线游戏。我有几个这样的课程:
class Game(object):
def __init__(self, player1, player2):
self.board = [['','',''],
['','',''],
['','','']]
self.players = [player1, player2]
class Player(object):
def __init__(self, game, marking):
self.game = game
self.marking = marking # either 'X' or 'O'
很明显,游戏需要引用两个玩家并且玩家也是游戏的一部分,因此应该参考游戏。但是,上面的代码不起作用,因为我没有办法在没有先创建游戏的情况下创建一个玩家。但要创造一个游戏,我需要两个玩家。
之后我可以通过做类似的事情来添加这些引用:player.game = some_game_reference
但是这似乎是单声道的,并且很难以跟上。
实现这一目标的最佳和最pythonic方法是什么?
答案 0 :(得分:2)
您可以只有一个类或另一个更新其参数。例如,首先创建玩家,然后让游戏更新玩家:
class Game(object):
def __init__(self, player1, player2):
self.board = [['','',''],
['','',''],
['','','']]
self.players = [player1, player2]
player1.game = self
player2.game = self
player1.marking = 'X'
player2.marking = 'O'
# Neither game nor marking make sense to set initially, until
# the players are added to a game.
class Player(object):
def __init__(self):
pass
p1 = Player()
p2 = Player()
g = Game(p1, p2)
(无论你是否需要这种耦合,正如其他人所指出的那样,是一个单独的设计问题。)
只是为了表明另一个方向是可行的:
class Player(object):
def __init__(self, game, marking):
self.game = game
self.marking = marking
game.players.append(self)
class Game(object):
def __init__(self):
self.board = [['','',''],
['','',''],
['','','']]
g = Game()
p1 = Player(g, 'X')
p2 = Player(g, 'O')
但是,希望你能够同意为游戏分配标记更有意义。在这里,您可以尝试在游戏中添加2个以上的玩家,或者添加两个X
或两个O
玩家。