Python:类中的静态对象

fla*_*kes 0 python static dictionary class

我想知道如何在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}
Run Code Online (Sandbox Code Playgroud)

现在,如果我直接调用该类并用新字典替换d

>>> dTest.d = {}
>>> a.d
{}
Run Code Online (Sandbox Code Playgroud)

但是,如果我用新词典替换广告,我也希望具有相同的功能

>>> a.d = {"Fourth":4}
>>> a.d
{'Fourth': 4}
>>> dTest.d
{}
Run Code Online (Sandbox Code Playgroud)

我现在想要的结果是dTest.d与广告相同(dTest.d为{'Fourth':4})。

是否有适当的做法,还是必须确保仅从dTest实例进行编辑时才编辑对象?

谢谢!

Joe*_*ett 5

处理类时,有两种不同类型的变量:实例变量和类变量。

可以从类的所有实例以及类本身访问类变量:

>>> class Foo(object):
...    class_var = {'one': 1}
...
>>> Foo.class_var
{'one': 1}
>>> a, b = Foo(), Foo()
>>> a.class_var
{'one': 1}
>>> b.class_var
{'one': 1}
>>> a.class_var is b.class_var 
True # These are the same object
>>> 
Run Code Online (Sandbox Code Playgroud)

实例变量只能从分配给它们的特定实例访问:

>>> class Foo(object):
...     def __init__(self):
...             self.instance_var1 = {'two': 2}
... 
>>> foo = Foo()
>>> foo.instance_var2 = {'three': 3}
>>> foo.instance_var1
{'two': 2}
>>> foo.instance_var2
{'three': 3}
>>> Foo.instance_var1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Foo' has no attribute 'instance_var1'
Run Code Online (Sandbox Code Playgroud)

实例变量可以覆盖类变量:

>>> class Foo(object):
...     my_var = {'one': 1} # This a class variable
... 
>>> foo = Foo()
>>> foo.my_var = {'two': 2} # Override class my_var with instance my_var
>>> foo.my_var
{'two': 2}
>>> Foo.my_var
{'one': 1}
>>> foo.__class__.my_var # But you can still access the class variable like this.
{'one': 1}
>>> 
Run Code Online (Sandbox Code Playgroud)

具体回答您的问题。如果要更改变量,则必须从而不是实例中进行设置,因此:

dTest.d = {'blah': 'blah'}
Run Code Online (Sandbox Code Playgroud)

要么

a.__class__.d = {'blah': 'blah'}
Run Code Online (Sandbox Code Playgroud)

如果你只是做

a.d = {'blah': 'blah'}
Run Code Online (Sandbox Code Playgroud)

您创建a该阴影的实例变量,或使用相同的名称覆盖类变量。