gpt4 book ai didi

Python:类中的静态对象

转载 作者:行者123 更新时间:2023-12-05 00:50:16 27 4
gpt4 key购买 nike

我想知道如何在 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 实例中编辑对象时才编辑对象?

谢谢!

最佳答案

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

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

>>> 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
>>>

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

>>> 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'

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

>>> 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}
>>>

具体回答您的问题。如果你想改变 class 变量,你必须从 class 设置它,而不是实例,所以:

dTest.d = {'blah': 'blah'}

a.__class__.d = {'blah': 'blah'}

如果你这样做

a.d = {'blah': 'blah'}

您创建一个 a 的实例变量,它会隐藏或覆盖具有相同名称的类变量。

关于Python:类中的静态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com