类交叉引用?

时间:2017-06-17 23:16:15

标签: python c++ class inheritance

我来自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方法是什么?

1 个答案:

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