2016-08-15 36 views
0

假设我有一个类Game,属性player1,player2Qplayer1player2本身也是Player类别的实例,该类别也具有名为Q的属性。我想这样做,当我实例化一个Game时,它共享它的Q与它实例化的Player的实例。如何在Python中的不同类之间共享实例变量

为了说明我的意思,考虑下面的代码:

class Game: 
    def __init__(self, player1, player2): 
     self.player1 = player1 
     self.player2 = player2 
     self.Q = {} 

class Player: 
    def __init__(self, mark): 
     self.mark = mark 
     self.Q = {} 

player1 = Player(mark="X") 
player2 = Player(mark="O") 

game = Game(player1, player2)   # Instantiate a game with player 1 and player 2 

game.Q["some key"] = "some value" 

# I would like this to happen automatically 
player1.Q = game.Q 
player2.Q = game.Q 

我想player1player2Q变量时,它改变得到自动更新game.Q。我怎样才能做到这一点?

+2

'self.Q = self.player1.Q = self.player2.Q = {}'在构造函数中完成了。 –

+0

@Rawing:你也可以写出完整的答案。 –

+1

q的内容有些模糊地描述,但我想,在一个结构良好的解决方案中,玩家实例应该接收对其游戏的引用,而不是复制成员变量。 – guidot

回答

0

Rawing的评论,我在Game__init__使用self.Q = self.player1.Q = self.player2.Q = {}

class Game: 
    def __init__(self, player1, player2): 
     self.player1 = player1 
     self.player2 = player2 
     self.Q = self.player1.Q = self.player2.Q = {} 

class Player: 
    def __init__(self, mark): 
     self.mark = mark 
     self.Q = {} 

player1 = Player(mark="X") 
player2 = Player(mark="O") 

game = Game(player1, player2)   # Instantiate a game with player 1 and player 2 

game.Q["some key"] = "some value" 

结果,player1.Q,现在产量{'some key': 'some value'},而无需 '手动更新' 吧。

+0

还在'Player'类中设置'self.Q = None'。 –

+0

@ HiI'mFrogatto我不会在'Player .__ init__'中初始化'self.Q'(可以是空的'dict'或'None')。如果你以某种方式尝试访问'Player'实例的'.Q'属性,然后播放器连接到一个'Game'实例,它将会以'AttributeError'异常的方式失败。如果发生这种情况,您会知道您的代码逻辑中存在缺陷,需要修复。 –

0

您可以Q引入基类的类属性:

class Base(object): 
    Q = {} 


class Player(Base): 
    def __init__(self, mark): 
     self.mark = mark 


class Game(Base): 
    def __init__(self, player1, player2): 
     self.player1 = player1 
     self.player2 = player2 


player1 = Player(mark="X") 
player2 = Player(mark="O") 

game = Game(player1, player2)   # Instantiate a game with player 1 and player 2 

game.Q["some key"] = "some value" 

但是这只有当你想有比赛的一个实例与球员,因为如果你创造未来Game它将具有相同Q为前一个。

+1

它的确,'Q'字典实例在所有类实例之间共享。 –

+0

@guidot:它们将被同步,因为它们都使用一个Base.Q类属性。正如Mateusz所说的,缺点是你不能用不同的Q创建多个游戏实例,但这在这个应用程序中可能不是问题。 –

相关问题