通过SuperClass update()方法更新类实例属性

时间:2014-10-14 18:17:02

标签: python oop inheritance

我正在编写模拟用于研究群体和避障场景中的无人机交互的模拟。我目前的问题是让车辆更新他们的位置。基本上,我有一个基类,它包含update()方法,该方法进行计算以获得新的位置和速度。 sim代码中的实际对象是其子类的实例,在子类的update()方法中,我所做的只是更新加速度向量并调用super()。update()。但是,函数调用后会保留这些值。我认为这只是我对Python缺乏了解,因为我刚开始使用它(来自C ++多年)。我所做的搜索通过引用传递给我的信息很好,但到目前为止我无法得到这个具体问题的答案。这是代码:

[编辑]根据jonrsharpe的要求,我写了一个最小的例子,它封装了我遇到的问题。这是最小的代码:

class UpdateTester:
    x = [0,0]

    def update(self):
        for elem in self.x:
            elem += 1

class SubClassTester(UpdateTester):
    def update(self):
        super(SubClassTester,self).update()


a = SubClassTester()

for i in range(1,5):
    a.update()
    print(a.x)

所以基本上,根据我的(无可否认有限的)理解,我应该得到一个输出,显示列表a.x的增量。但是,运行此示例的输出显示重复的[0,0]为输出。

1 个答案:

答案 0 :(得分:1)

整数在Python中是不可变的,因此for elem in self.x: elem += 1 nothing 。它不会改变self.x。如果您想更改self.x

for i, value in enumerate(self.x):
    self.x[i] = value + 1

UpdateTester.x也是一个类变量。所有实例都是一样的。列表在Python中是可变的,因此如果您在.update()类的任何实例上调用UpdateTester,那么您可以更改所有这些列表的列表。要改为创建每个实例列表,请将其放在__init__()

class UpdateTester(object):
    def __init__(self, **kwargs):
        super(UpdateTester, self).__init__(**kwargs) # for multiple inheritence
        self.x = []