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

0 投票
1 回答
672 浏览
提问于 2025-04-27 13:52

我正在编写一个模拟程序,用来研究无人机在群体中如何互动以及如何避开障碍物。目前我遇到的问题是,车辆的位置更新不正常。简单来说,我有一个基础类,这个类里面有一个叫做update()的方法,用来计算新的位置和速度。在模拟代码中,实际的对象是这个基础类的一个子类的实例。在子类的update()方法里,我只更新加速度向量,然后调用父类的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 个回答

1

在Python中,整数是不可变的,这意味着当你写 for elem in self.x: elem += 1 时,其实是没有任何效果。这段代码不会改变 self.x 的值。如果你想要改变 self.x 的话,你需要这样做:

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

另外,UpdateTester.x 是一个类变量,所有的实例都是共享这个变量的。列表在Python中是可变的,所以如果你在任何一个 UpdateTester 类的实例上调用 .update(),那么所有实例的列表都会被改变。如果你想为每个实例创建一个独立的列表,就需要把它放在 __init__() 方法里:

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

撰写回答