Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类交叉引用? 我来自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 - Fatal编程技术网

类交叉引用? 我来自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