所以,我有这个班级
class table:
h = 0
g = 0
我有这个类的一个元素叫做aux。
aux = table
aux.g等于零 后来我称这个函数为move(aux)
move(x):
newTable = table
newTable.g = x.g + 1
newTable.g按预期收到1,但x.g也从0变为1.为什么?
在此先感谢,阿德里亚诺
答案 0 :(得分:6)
这是因为您声明等效于static class variable,当您更新它时,它会针对该类的每个实例进行更新。你想要的是像这样声明instance variables:
aux = table()
现在,当你实例化这样的类:aux
时,它会将值分配给表的实例 - 只是move(x):
newTable = table()
newTable.g = x.g + 1
变量。
您的移动功能如下所示:
newTable.g
会增加x.g
的值,但不会 return newTable
的值。你可能也想要像这样返回新表:aux = table
然后你可以在其他函数中使用它。
值得注意的是,在您的代码中,您实际上从未实际执行表类的实例化。这意味着,当您指定aux
时,它只会将类的引用分配给变量__init__
。要创建类的实例,可以像调用函数一样调用类 - 这称为构造函数 - 它调用类的aux = table()
方法。因此,当我声明__init__
时,将执行表ServletRequest.getRemoteAddr()
方法,然后返回该类的新实例。
答案 1 :(得分:2)
h
和g
是静态的,即“类变量”。 h
和g
对于类table
的对象不是唯一的,而是该类本身的属性。
答案 2 :(得分:2)
通过在类上定义属性,它们将绑定到整个类(静态),而不是单个实例(也称为对象)。你更想要的是在构造函数中分配它们:
class Table:
def __init__(self):
self.h = 0
self.g = 0
def move(self, delta):
self.h += deta
请注意,我还将移动功能更改为方法。不同之处在于方法会更改单个实例的状态。
然后,您可以创建实例并使用它们:
t1 = Table()
t2 = Table()
t1.move(10)
print(t1.h) # will print 10
print(t2.h) # will print 0
答案 3 :(得分:2)
当你这样做时:
accel = 20.0 # steps/sec/sec
time_passed = 0.000
steps_done = 0
cur_speed = 0 # steps/sec
time_for_next_step = 0.0
while (steps_done < steps_needed):
if (time_passed >= time_for_next_step):
self.oneStep(direction, stepstyle)
steps_done += 1
time_for_next_step = time_passed + 1.0/cur_speed
time.sleep(1); # 1 millisecond, I assume
time_passed += 0.001
cur_speed += accel/1000.0
和此:
aux = table
您没有创建类newTable = table
的新对象实例。您只需使用两个不同的变量引用类table
自己的实例。总之,table
和aux
引用(原谅我这样做; 指向)同样的事情。
请注意,newTable
是类h, g
的共享属性。它们由类table
的所有实例共享。