我有一个使用字典的简单数据存储对象。 当我创建这个对象的两个实例时,似乎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等)
在这里,你有:
因此,您有:
Obj.value
,这是一个类级变量(对所有Obj
实例通用)obj.value
,是obj
的对象级变量,其中obj
是Obj
类型的实例在python中,任何在类声明中赋值的变量都是静态的 而任何在类方法中赋值的变量都是实例变量。你知道吗
更多细节请参见here。你知道吗
因为在第一个示例中,变量是class属性,所以它们对所有类(而不是实例)都是公共的。你知道吗
本文对此进行了很好的解释https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide
致以最诚挚的问候
相关问题 更多 >
编程相关推荐