在Python中的所有对象中调用相同的方法?

时间:2014-01-19 00:37:40

标签: python simulation gravity

长话短说,我需要找到一个在多个对象中调用相同方法的快捷方式。

现在,所有类都有相同的父类,即使方法因不同的类而不同,我认为这些方法的名称相同。所以我虽然我可能只能做这样的事情:

for object in listOfObjects:
    object.method()

它没有奏效。这可能是我的拼写错误,但我找不到它。我想我可以通过制作一个只添加我需要的对象的列表来解决它,但这需要大量编码,包括更改其他类。 ~~跳过最后一段伪代码准确描述我需要什么~~


此时,我将更详细地了解具体到底是做什么的。我希望它能更好地说明我的问题的范围,并且回答我的问题将更广泛地适用。这个问题的一般用法如上所述,但这可能有助于回答这个问题。请注意,一旦我得到一个更接近代表我需要做的答案的答案,我将更改问题,以便它可以适用于各种各样的问题。

我正在研究重力模拟器。虽然大多数模拟器制造的物体彼此相互作用并且表示其重心是实际吸引点的全身,但我试图编写一个程序来模拟物体内所有给定点的重力分布。

因此,每个对象(不是编程术语,用字面意思)都是由一堆微小的对象(字面和比喻)组成。基本上,我要做的是调用object.gravity()方法,它基本上考虑了模拟中所有其他对象的所有重力,然后根据该输入移动该特定对象的位置。

现在,无论是由于语法错误(我有点怀疑)还是由于Python的限制,我无法让所有粒子一次性正常运行。我之前发布的代码片段似乎没有用。

TL; DR:

因此,我想知道是否有一种方法(保存将所有对象添加到列表然后迭代它),只需在具有该方法的每个对象上调用.gravity()方法。基本上,即使这是一种列表格式,这也是我想要做的:

for ALL_OBJECTS:
    if OBJECT has .gravity():
        OBJECT.gravity()

3 个答案:

答案 0 :(得分:4)

你想要hasattr() function

for obj in all_objects:
    if hasattr(obj, 'gravity'):
        obj.gravity()

或者,如果gravity方法由特定父类定义,您也可以测试它:

for obj in all_objects:
    if isinstance(obj, Planet):
        obj.gravity()

答案 1 :(得分:0)

也可以做...更好的pythonic方式来做到这一点

for obj in all_objects:
    try:
        obj.gravity()
    except AttributeError:
        pass

答案 2 :(得分:0)

getattr default的{​​{1}}选项设置为getattr时使用lambda: None

for obj in all_objects:
    getattr(obj, 'gravity', lambda: None)()