2016-08-15 159 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創建多個遊戲實例,但這在這個應用程序中可能不是問題。 –

相關問題