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被重新分配。使用可变数据结构(如字典)来获得预期的行为。这并不完全正确(尽管对于简单的属性分配有效)。一旦您有了可变的数据结构,实例就会连接起来。