python - python3可变属性是否共享?
问题描述
在我实例化同一个类的两个不同对象的代码中,怎么可能object1
改变object2
的属性?如何保留不同的“self.mutable”变量?我的错在哪里?:-)
谢谢
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
原则上,这种共享与可变或不可变的属性无关,但您的代码中有一些细微差别可能会让人感到困惑。
在 的情况下mutable
,观察到的行为很容易解释。
首先,dictmutable
在内存中总是同一个对象:
>>> o1, o2 = Class(), Class()
>>> o1.mutable is o2.mutable is Class.mutable
True
当你mutate
以任何方式可变时,在任何地方都可以看到这种变化,即持有对该 dict 的引用。
>>> Class.mutable
{}
>>> o2.mutable[1] = 2
>>> o1.change()
>>> Class.mutable
{1: 2, 'key': 'value'}
到目前为止,这一切都是意料之中的。棘手的部分immutable
是您不会Class.mutable
在更改中发生变异,而是将属性分配给正在调用mutable
的实例(self
) !change
在调用 change 之前,只存在于类级别,在实例上immutable
查找时通过类访问。(注意和的实例 dicts 是如何为空的。)o1
o2
o1
o2
>>> o1, o2 = Class(), Class()
>>> o1.immutable, o2.immutable, Class.immutable
(0, 0, 0)
>>> o1.__dict__, o2.__dict__, 'immutable' in Class.__dict__
({}, {}, True)
调用change
时,您只需在实例上o2
设置属性!immutable = 1
o2
>>> o2.change()
>>> o1.immutable, o2.immutable, Class.immutable
(0, 1, 0)
>>> o1.__dict__, o2.__dict__, 'immutable' in Class.__dict__
({}, {'immutable': 1}, True)
>>> o1.immutable is Class.immutable
True
>>> o2.immutable is Class.immutable
False
重要的是要理解在类级别设置的可变和不可变对象以完全相同的方式共享。唯一的区别是可变对象没有改变它们的方法。但是,如果您已完成self.mutable = {'key': 'value'}
然后change
调用change
特定实例,则mutable
在通过点符号在实例上查找时,在实例上定义的属性将优先于在类级别定义的属性。
推荐阅读
- wordpress - WordPress 打开 .docx 而不是下载
- reactjs - TypeError: register 不是 react-hook-form 中的函数
- kubernetes - Cert-Manager k8s,更新证书流程
- c# - ASP .NET Core 标识无法在 ASP .NET Core 5.0 Razor Pages Web 应用程序中正常工作
- github - CI 测试在 Dependabot 拉取请求上失败
- qt - 修改 Qt 6.1.2 中 QML 的简单按钮的悬停行为
- mysql - install_driver(mysql) failed: Attempt to reload DBD/mysql.pm aborted error in Bugzilla installation on Windows
- python - 在不使用 OpenCV 的情况下获取图像掩码
- linux - 使用 ffmpeg 和 nginx 设置 rtmp 音频流时出现问题
- c# - 具有列数 css 属性的 PDFhtml