通过超类的update()方法更新类实例属性
我正在编写一个模拟程序,用来研究无人机在群体中如何互动以及如何避开障碍物。目前我遇到的问题是,车辆的位置更新不正常。简单来说,我有一个基础类,这个类里面有一个叫做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 = []