我想知道如何在python类中正确地保留一个静态对象。 在这种情况下,我想要一个静态字典
我要找的只是一个简单的例子:
class dTest:
# item I want to be static
d = {"First":1}
>>> a = dTest()
>>> a.d
{'First': 1}
>>> dTest.d["Second"] = 2
>>> a.d["Third"] = 3
>>> a.d
{'Second': 2, 'Third': 3, 'First': 1}
>>> dTest.d
{'Second': 2, 'Third': 3, 'First': 1}
现在如果我直接调用类并用新字典替换d
>>> dTest.d = {}
>>> a.d
{}
不过,如果我用新字典替换a.d,我也希望有相同的功能
>>> a.d = {"Fourth":4}
>>> a.d
{'Fourth': 4}
>>> dTest.d
{}
我现在想要的结果是dTest.d与a.d相同(dTest.d是{'Fourth':4})。
是否有适当的实践,或者如果我从dTest实例中编辑对象,我必须确保我只编辑过它吗?
谢谢!
处理类时有两种不同类型的变量:实例变量和类变量。
类变量可以从类的所有实例以及类本身访问:
实例变量只能从分配给它们的特定实例访问:
实例变量可以覆盖类变量:
专门回答你的问题。如果要更改类变量,则必须从类而不是实例设置该变量,因此:
或者
如果你愿意的话
您可以创建一个
a
的实例变量来隐藏或重写同名的类变量。您在类中使用的字典是共享的,当您使用
a.d[key]=...
或dTest.d[key]=...
向d
添加键值对时,您不会更改d
的引用,因此它仍然是共享的类属性。但是,如果您试图将某些内容赋给
a.d
,比如a.d=123
或a.d=[11,22]
,您将创建一个属性d
,例如a
,并且a.d
不再引用dType.d
。见Assignment statements:注意:如果对象是类实例,并且属性引用发生在赋值运算符的两侧,则RHS表达式
a.x
可以访问实例属性或类属性(如果不存在实例属性)。LHS目标a.x
始终设置为实例属性,必要时创建它。因此,a.x的两个出现不一定指同一个属性:如果RHS表达式指类属性,则LHS创建一个新的实例属性作为赋值的目标:相关问题 更多 >
编程相关推荐