同一类的两个实例的Class属性

时间:2011-12-31 12:15:29

标签: python

有这段代码:

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?

7 个答案:

答案 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)

同一个类的两个实例不共享相同的内存和相同的变量。例如,您可以拥有Carcolorred的{​​{1}}和另一种颜色为blue的{​​{1}}。

答案 4 :(得分:1)

您已在标题中回答了问题。它们是同一类的两个独立且不同的实例object1object2是不同的对象,因此对其中一个对象发生的任何事情都不会改变另一个对象。

答案 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