此问题已经在这里有了答案:
我有一个使用字典的简单数据存储对象。当我创建此对象的两个实例时,似乎商店字典被视为静态变量,第二个对象覆盖了第一个对象。但是,该类中的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
我不明白为什么在我的第一个示例中将商店字典视为“静态”。
有人可以解释一下这里发生了什么吗?非常感谢。
在这里,您有:
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
的实例因为在您的第一个示例中,变量是类属性,所以它们对所有类(而不是实例)通用。
这篇文章很好地解释了https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide
最诚挚的问候
在python中,在类声明中分配了值的任何变量都是静态的而在类方法中分配了值的任何变量都是实例变量。
请参见here以获取更多详细信息。