Python 将函数映射到对象字典

Python 将函数映射到对象字典,python,python-3.x,pygame,Python,Python 3.x,Pygame,我有一个网络游戏,我经常在游戏对象字典上循环调用一个函数,例如draw或send_location或get location。我正在寻找一种改进的方法。我希望能够调用一个函数,它接受一个函数作为参数,然后在每个游戏对象上调用该函数。有时函数是每个对象的一个类方法,这使得它有点困难。这是我到目前为止所拥有的。游戏对象字典的结构类似于游戏对象={'players':[player1,player2],'other_objects':[object1,object2]} def loop_over_g

我有一个网络游戏,我经常在游戏对象字典上循环调用一个函数,例如draw或send_location或get location。我正在寻找一种改进的方法。我希望能够调用一个函数,它接受一个函数作为参数,然后在每个游戏对象上调用该函数。有时函数是每个对象的一个类方法,这使得它有点困难。这是我到目前为止所拥有的。游戏对象字典的结构类似于游戏对象={'players':[player1,player2],'other_objects':[object1,object2]}

def loop_over_game_dict(self, func, *args):
  """looop over the game dictionary and apply function with the arguments to
  all objects"""
  for obj_type, obj_list in self.game_objects.items():
    for game_obj in obj_list:
        # apply some function with the current game object as the first parameter
        func(game_object, *args)
例如,如果我想要一个构建游戏包的函数

def send_location(self, game_obj, packet ):
  packet[game_obj.id] = packet.serialize(game_obj.rect.x, game_obj.rect.y)

# somewhere in the code
loop_over_game_dict(send_location, packet_object)

我的问题是,如果有的话,在其他游戏中是如何做到这一点的?我觉得我经常在游戏中循环对象来做一件事(碰撞检测、渲染),这会使它简单得多。一直在它们上面循环是我设计中的一个缺陷吗?

我不确定这个问题与你的游戏代码有什么特别的关系,但是

在一组对象上的显式循环通常不是设计缺陷(尽管在某些情况下,如CPU限制的数学,它可能不是最快的解决方案):

然而,如果您发现这是不必要的冗长,Python还提供了至少两种以单行形式执行上述操作的其他方法

列表理解:

results = [ func(obj) for obj in input ]
或者
map
函数,它是从函数式编程语言借用/启发而来的:

results = map(func, obj)

列表理解,我知道它,但没有想到在这里使用它。谢谢
results = map(func, obj)