0

私は次のように定義されたクラスを持っています:

class GameState:

    def __init__(self, state=None):
        if state is None:
            self.fps = 60
            self.speed = 1
            self.bounciness = 0.9
            self.current_level = None

            self.next_frame_time = 0
            self.init_time = 0
            self.real_time = 0
            self.game_time = 0

            self.game_events = []
            self.real_events = []
        else:
            # THIS being the key line:
            self.__dict__.update(**state)

これが機能するように(つまり、**演算子が私のクラスで機能するように)定義できるインターフェイスはありますか?

>>> a = GameState()
>>> b = GameState(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: update() argument after ** must be a mapping, not GameState

b基本的に、私はのすべての属性を引き受けたいと思いますa

うまくいくとは思いませんでしたが__getitem__、運が悪かったので定義してみました。

編集__dict__:引数として辞書を渡すこともできるようにしたいので、bの使用を避けたいと思います。また、他の場所のGameStateオブジェクトで**を使用する可能性があります。

4

3 に答える 3

5

GameStateにdictから継承させます:

class GameState(dict) 

__setattr関数を次のように書き直します。

def __setattr__(self,name,value) :
    self.__dict__[name] = value
    self[name] = value
于 2012-05-10T17:16:35.460 に答える
2

動作させるには、 andメソッド**objを実装(または継承)する必要があります。__getitem__()keys()

def __getitem__(self, item):
    return self.__dict__[item] # you maybe should return a copy
def keys(self):
    return self.__dict__.keys() # you could filter those
于 2012-05-10T17:20:01.937 に答える
1

これを行うには、bを作成するときにbのdictをaのdictで更新します。これを試してみてください:

class GameState:

    def __init__(self, state=None):
        if state is None:
            self.fps = 60
            self.speed = 1
            self.bounciness = 0.9
            self.current_level = None

            self.next_frame_time = 0
            self.init_time = 0
            self.real_time = 0
            self.game_time = 0

            self.game_events = []
            self.real_events = []
        else:
            if type(state) is dict:
                self.__dict__.update(**state)
            else:
                self.__dict__.update(**state.__dict__)

a = GameState() 
b = GameState(a)

属性の一部としてリストオブジェクトがあるため、dictのディープコピーを作成することをお勧めします。オブジェクトの共有がないため、これはより安全です。

于 2012-05-10T17:09:52.463 に答える