我有一个如此定义的类:
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__
没有任何运气。
编辑:我想避免使用b __dict__
,因为我也希望能够将字典作为参数传递,并且可能在其他地方的GameState对象上使用**。 / p>
答案 0 :(得分:5)
让GameState继承自dict:
class GameState(dict)
并重写__setattr函数,如下所示:
def __setattr__(self,name,value) :
self.__dict__[name] = value
self[name] = value
答案 1 :(得分:2)
要使**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
答案 2 :(得分:1)
你可以通过在创建b时更新b的 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的深层复制,因为您有一个列表对象作为属性的一部分。这是更安全的,因为没有共享对象。