python类中的字典被视为静态对象? [重复]

问题描述 投票:0回答:3

此问题已经在这里有了答案:

我有一个使用字典的简单数据存储对象。当我创建此对象的两个实例时,似乎商店字典被视为静态变量,第二个对象覆盖了第一个对象。但是,该类中的value变量不是静态的。这是一个简单的代码示例:

class Obj():
    store = {}
    value = None

    def __init__(self, id, name, value=None):
        self.store["Id"] = id
        self.store["Name"] = name
        self.value = value

    def __getitem__(self, item):
        return self.store[item]

    def __str__(self):
        return f'{self["Id"]}:{self["Name"]} {self.value}'

obj1 = Obj(5680, "Dimmer", 100)
obj2 = Obj(5681, "ON/OFF", True)

print(obj1)
print(obj2)

我得到的是这个:

> 5681:ON/OFF 100
> 5681:ON/OFF True

但是如果我将商店字典的定义位置更改为__init__方法,则可以使用:

class Obj():
    value = None

    def __init__(self, id, name, value=None):
        self.store = {}
        self.store["Id"] = id
        self.store["Name"] = name
        self.value = value

输出是这个:

> 5680:Dimmer 100
> 5681:ON/OFF True

我不明白为什么在我的第一个示例中将商店字典视为“静态”。

有人可以解释一下这里发生了什么吗?非常感谢。

python dictionary constructor static init
3个回答
1
投票

在这里,您有:

class Obj():
    value = None # class-level variable

    def __init__(self, value=None):
        self.value = value # object-level variable

因此,您有:

  • Obj.value,这是一个类级别的变量(对于所有Obj实例来说都是公共的)
  • obj.value,它是obj的对象级变量,其中obj是类型Obj的实例

0
投票

因为在您的第一个示例中,变量是类属性,所以它们对所有类(而不是实例)通用。

这篇文章很好地解释了https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

最诚挚的问候


0
投票

在python中,在类声明中分配了值的任何变量都是静态的而在类方法中分配了值的任何变量都是实例变量。

请参见here以获取更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.