Class 交叉引用?

Class cross referencing?

我有 C++ 背景,没有 python 中的整个指针概念我有点迷茫。或者至少不清楚。 例如,我想在 Python 中使用 OOP 创建一个 tick tack toe 游戏。我有一对 类 像这样:

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 和乏味跟上。

完成此任务的最佳和最 pythonic 方法是什么?

您可以只让一个 class 或另一个更新其参数。例如,先创建玩家,然后让游戏自己更新玩家:

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 玩家。