2016-08-15 15 views
0

属性player1,player2、およびQのクラスGameがあるとします。 player1player2は、それ自体がというクラスのインスタンスであり、属性もQとなっています。私はGameをインスタンス化するときにQPlayerのインスタンスと共有するようにしたいと思います。このコードを検討し、私が何を意味するか説明するために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'のいずれか)。プレーヤーが 'Game'インスタンスに接続される前に' Player'インスタンスの '.Q'属性に何らかの方法でアクセスしようとすると、それは' 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つのインスタンスを持つようにしたい場合にのみ機能します前の1つ

+1

'Q' dictインスタンスは、すべてのクラスインスタンスで共有されます。 –

+0

@ guidot:それらはすべて1つのBase.Qクラス属性を使用しているため、同期されます。欠点は、Mateuszが言及しているように、異なるQを持つ複数のGameインスタンスを作成することはできませんが、このアプリケーションでは問題にならない可能性があります。 –

関連する問題