类交叉引用? 我来自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'
很明显,游戏需要引用两个玩家,而且一个玩家也是游戏的一部分,因此应该引用游戏。但是,上面的代码不起作用,因为如果不先创建游戏,我无法创建一个玩家。但要创造一个游戏,我需要两个玩家。 我可以在以后添加这些引用,方法如下:类交叉引用? 我来自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',python,c++,class,inheritance,Python,C++,Class,Inheritance,很明显,游戏需要引用两个玩家,而且一个玩家也是游戏的一部分,因此应该引用游戏。但是,上面的代码不起作用,因为如果不先创建游戏,我无法创建一个玩家。但要创造一个游戏,我需要两个玩家。 我可以在以后添加这些引用,方法如下:player.game=some\u game\u reference,但这似乎不太和谐,而且很乏味 实现这一点的最佳和最具Python风格的方式是什么 您可以让一个类或另一个类更新其参数。例如,首先创建玩家,然后让游戏本身更新玩家: class Game(object):
player.game=some\u game\u reference
,但这似乎不太和谐,而且很乏味
实现这一点的最佳和最具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')
不过,希望你会同意,在游戏中给每个玩家分配一个分数更有意义。在这里,您可以尝试向一个游戏中添加两个以上的玩家,或者添加两个
X
或两个O
玩家。像object
,player1
等都是有效的指针。他们不是价值观,就像他们在C++中那样。为什么玩家需要知道游戏?游戏由一块棋盘和两名玩家组成。游戏知道轮到谁和棋盘的状态。玩家无需了解游戏。在python中,需要两个对象相互引用的情况非常罕见。当您确实需要时,通常其中一个包含另一个,并且通常会直接在另一个上设置对自身的引用(此时对象已经紧密耦合)。如果您创建游戏列表,您可以查询每个游戏是否包含特定玩家。这样一来,一名玩家甚至可以参加多场比赛,而不仅仅限于一场比赛。或者构建一个类Casino
来跟踪哪个玩家在玩哪个游戏。老实说,在Python中你根本不应该考虑指针。这是一种更高层次的语言。没有实际的指针类型,但是“在引擎盖下面”,您可以想象Python将指针传递给Py_Object
structs。但老实说,你应该读一下内德·巴奇尔德的《这很有帮助,谢谢你》。我会看看是否有其他答案发布,但这似乎解决了我的问题。我不知道我可以把self赋值给一个变量。你认为有更好的方法吗?上面的评论指出,通常不需要这样的东西,但在我看来,这样我可以创建某种图形(数据结构),每个玩家可能有多个游戏。谢谢!这实际上取决于应用程序的结构,但我同意您应该努力使玩家
类不需要关于玩家参与的游戏的任何信息。至于self
,这个名字没有什么特别之处;你可以使用任何你想要的名字,但是self
是传统的名字。它只是引用作为任何实例方法的(隐式)第一个参数传递的对象。任何方法调用obj.method(…)
都等价于type(obj.method(obj…)
;参数self
(或您使用的任何名称)绑定到obj
。