在我实例化同一类的两个不同对象的代码中,object1
如何可能改变object2
的属性?我怎样才能保持与众不同”自变的“变量?我的错在哪里?:-)
谢谢
class Class:
mutable = {}
immutable = 0
def change(self):
self.immutable = 1
self.mutable["key"] = "value"
def observe(self):
print(self.immutable, self.mutable)
object1, object2 = Class(), Class()
object1.change()
object2.observe()
# output is: 0 {'key': 'value'}
您已经在类级别上定义了
mutable
和immutable
, 因此,在Class
的所有实例中,两者都将是shared。链接问题中的答案详细解释了如何避免您所观察到的共享行为,因此我将仅解释您的代码发生了什么。你知道吗原则上,这种共享与可变或不可变的属性无关,但是代码中的一些细微差别可能会使它变得混乱。你知道吗
在
mutable
的情况下,观察到的行为很容易解释。你知道吗首先,dict
mutable
在内存中总是同一个对象:当您以任何方式
mutate
可变时,这种变化将在引用该dict的任何地方都可以看到。你知道吗到目前为止,所有这些都在预料之中。使用
immutable
最棘手的部分是,您不会在更改中变异Class.mutable
,而是将属性mutable
分配给正在调用的实例(self
)change
!你知道吗在调用change之前,
immutable
只存在于类级别,在实例o1
或o2
上查找时通过类进行访问。(注意o1
和o2
的实例dict是如何为空的。)在
o2
上调用change
时,只在实例o2
上设置属性immutable = 1
!你知道吗理解在类级别设置的可变和不可变对象是以完全相同的方式共享的,这一点很重要。唯一的区别是可变对象上没有改变它们的方法。但是,如果您在
change
中执行了self.mutable = {'key': 'value'}
,然后在特定实例上调用了change
,那么在实例上定义的mutable
属性在通过点表示法查找实例时将优先于在类级别定义的属性。你知道吗相关问题 更多 >
编程相关推荐