python类中的字典是否被视为静态对象?

2024-03-28 08:45:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我不明白为什么在我的第一个示例中,它将存储字典视为“静态的”。你知道吗

好的-我的store属性似乎是一个“class属性”-REF:https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

但是,我的值属性被视为“实例属性”,因为它被分配了一个不可变的值(None/Integer等)


Tags: 对象storenameselfnoneidobj字典
3条回答

在这里,你有:

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

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

因此,您有:

  • Obj.value,这是一个类级变量(对所有Obj实例通用)
  • obj.value,是obj的对象级变量,其中objObj类型的实例

在python中,任何在类声明中赋值的变量都是静态的 而任何在类方法中赋值的变量都是实例变量。你知道吗

更多细节请参见here。你知道吗

因为在第一个示例中,变量是class属性,所以它们对所有类(而不是实例)都是公共的。你知道吗

本文对此进行了很好的解释https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide

致以最诚挚的问候

相关问题 更多 >