gpt4 book ai didi

python - 类交叉引用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:55 25 4
gpt4 key购买 nike

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

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 且难以跟上。

完成此任务的最佳且最符合 Python 风格的方法是什么?

最佳答案

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

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

关于python - 类交叉引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44610281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com