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

Python 同一类的两个实例的Class属性,python,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? 类示例: 变量=2 object1=S

有以下代码:

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?
类示例:
变量=2
object1=Sample()
object2=Sample()
打印对象1.2变量#
打印object2.variable#2
object1.variable=1
打印object1.variable#1

print object2.variable#2同一类的两个实例不共享相同的内存和相同的变量。例如,您可以拥有一辆
汽车,其
颜色为
红色
,另一辆汽车的
颜色为
蓝色

不要将其与静态变量混淆。在您的例子中,两个对象都有一个名称
变量
指向实例化后的
2
对象。现在,如果在一个对象中将变量更改为
1
,则只需将
名称
绑定到另一个对象,即
1
对象。object2中的名称仍然引用
2
对象。原始类对象未被触及,并且名称
变量仍然指向
2
,因此
object3=Sample()
也将
2
绑定到
变量

解决此问题的一种方法是编写如下类:

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

这是因为所有类都将名称
变量
绑定到同一个可复制对象,并且您可以操作同一对象的内容(
变量[0]
)。

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

因为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

这也许是违反直觉的,但是当你写作的时候

object1.variable = 1
Sample.variable
您不是在为类变量赋值,而是定义一个同名的实例变量。(您可以检查
object1
\uuu dict\uuu
来验证这一点)。注意,如果你写

object1.variable = 1
Sample.variable

在这两种情况下都会得到
2
,因为
variable
实际上从未更改过。要分配给它,可以如上所述引用它--
object1。例如,将其设置为
object2.variable==1

看看这个

简而言之,类和类实例具有不同的名称空间(实际上,这不是很正确,因为实例名称空间位于类名称空间的顶部,这样,如果您有一个类atribute和一个具有相同名称的实例属性,那么将通过
inst.attr
,otherways-class“one”访问实例“one”)

object1.variable = 1
实际上并没有更改类变量(在其他语言中通常称为静态字段),只需将名为
variable
的新字段绑定到类实例
object1

您可能想做的是更改类变量,而不是实例变量。可以这样做:

Sample.variable = 1
object1.__class__.variable = 1
或者像这样:

Sample.variable = 1
object1.__class__.variable = 1

因为您将新实例变量指定给实例,而不是类变量。如果您可以更改类属性,则必须通过
\uuuuu class\uuuuu
属性来设置变量。(或直接指定给类对象。)


可能的重复对于我的理解,我只是问这个问题:问题背后的想法是什么?object1和object2不是很明显是同一类的不同实例吗?我想他认为
变量
是静态的,因为它是在函数之外定义的,或者类似的东西。真的不确定:)不知何故,这仍然是一个合理的问题。@hochl:+1表示“不知何故”:Dit被重新分配。使用可变数据结构(如字典)来获得预期的行为。这并不完全正确(尽管对于简单的属性分配有效)。一旦您有了可变的数据结构,实例就会连接起来。