有这段代码:
class Sample:
variable = 2
object1 = Sample()
object2 = Sample()
print object1.variable # 2
print object2.variable # 2
object1.variable = 1
print object1.variable # 1
print object2.variable # 2 <- why not 1 too?
为什么 object2.variable 在赋值给类变量后也不是1?
答案 0 :(得分:5)
不要将它与静态变量混淆。在您的情况下,两个对象在实例化后都有一个名称variable
指向2
对象。现在,如果在一个对象中将变量更改为1
,则只需将name
绑定到另一个对象,即1
对象。 object2中的名称仍然引用2
对象。原始类对象未受影响,名称variable
仍指向2
,因此object3 = Sample()
也会2
绑定到variable
。< / p>
解决这个问题的一种方法是编写类如下的类:
>>> class Sample:
... variable=[2]
...
>>> object1 = Sample()
>>> object2 = Sample()
>>> print object1.variable[0]; print object2.variable[0]
2
2
>>> object1.variable[0]=1
>>> print object1.variable[0]; print object2.variable[0]
1
1
这是因为所有类都将名称variable
绑定到相同的 muatable 对象,并且您操纵同一个对象(variable[0]
)的内容。
答案 1 :(得分:4)
因为您将新的实例变量分配给实例,而不是类变量。如果您可以更改类属性,则必须通过__class__
属性设置变量。 (或直接到类对象。)
class Sample:
variable = 2
object1 = Sample()
object2 = Sample()
print object1.variable # 2
print object2.variable # 2
object1.__class__.variable = 1 # or Sample.variable = 1
print object1.variable # 1
print object2.variable # 1
答案 2 :(得分:2)
看看这个question。
简而言之,你的类和你的类实例有不同的命名空间(实际上,这不是很正确,因为实例命名空间有点放在类'命名空间之上,以便万一你有一个类属性和一个实例属性同名,实例'一个将通过inst.attr
访问,另一个 - 类'一个)。所以,当你做的时候
object1.variable = 1
您实际上并未更改类变量(通常在其他语言中称为静态字段),您只需将名为variable
的新字段绑定到类实例 object1
。
您可能想要做的是更改类变量,而不是实例1。可以这样做:
Sample.variable = 1
或者像这样:
object1.__class__.variable = 1
答案 3 :(得分:1)
同一个类的两个实例不共享相同的内存和相同的变量。例如,您可以拥有Car
为color
为red
的{{1}}和另一种颜色为blue
的{{1}}。
答案 4 :(得分:1)
您已在标题中回答了问题。它们是同一类的两个独立且不同的实例。 object1
和object2
是不同的对象,因此对其中一个对象发生的任何事情都不会改变另一个对象。
答案 5 :(得分:1)
因为object1是与object2不同的对象。要让它们相同,你需要做
class Sample:
variable = 2
object1 = Sample()
object2 = object1
print object1.variable
print object2.variable
object1.variable = 1
print object1.variable
print object2.variable
请注意
行object2 = object1
答案 6 :(得分:1)
这可能违反直觉,但是当你写
时object1.variable = 1
您没有分配给类变量,而是定义了同名的实例变量。 (您可以检查object1
的{{1}}来验证这一点。请注意,如果你写
__dict__
或
Sample.variable
在这两种情况下,您都会获得object1.__class__.variable
,因为2
从未实际更改过。要分配给它,您可以像上面那样引用它 - 例如,variable
使它也object1.__class__.variable = 1
。