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