我不明白以下示例中的区别。有一次类的实例可以改变另一个实例的类变量,而另一个实例却不能吗?
示例1:
class MyClass(object):
mylist = []
def add(self):
self.mylist.append(1)
x = MyClass()
y = MyClass()
x.add()
print "x's mylist: ",x.mylist
print "y's mylist: ",y.mylist
输出:
x的mylist:[1]
y的mylist:[1]
因此,类x
的实例A
能够访问和修改类属性mylist
,它也是{{1}的实例y
的属性}}
示例2:
A
bankX的危机:真的
bankY的危机:错误
为什么这个例子不起作用?
答案 0 :(得分:6)
在第一种情况下,add方法中没有赋值:
def add(self):
self.mylist.append(1) # NOT self.mylist = something
在第二种情况下,有一项任务:
def bankrupt(self) :
self.crisis = True # self.crisis = something
当在实例上设置属性时,它总是仅在特定实例上设置(它被放到实例的__dict__
属性中)。班级__dict__
不受影响。
在第一种情况下,没有任何分配,因此适用标准查找规则。由于实例的__dict__
属性中没有“mylist”,因此它会回退到类__dict__
。
在add
中存储的MyClass.__dict__
变异值中执行的操作。这就是为什么在所有情况下都可以观察到变化的原因。
请考虑以下代码段(可能会更好地解释您的问题):
class MyClass:
x = []
x1 = MyClass()
x2 = MyClass()
x3 = MyClass()
x1.x.append(1)
print x1.x # [1]
print x2.x # [1]
print x3.x # [1]
assert x1.x is x2.x is x3.x
x3.x = "new" # now x3.x no longer refers to class attribute
print x1.x # [1]
print x2.x # [1]
print x3.x # "new"
assert x1.x is x3.x # no longer True!