【发布时间】:2019-11-28 10:39:19
【问题描述】:
我有一个使用字典的简单数据存储对象。 当我创建该对象的两个实例时,似乎存储字典被视为静态变量,第二个对象覆盖了第一个。但是,类中的 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
我不明白为什么在我的第一个示例中它将商店字典视为“静态”。
好的 - 我的商店属性似乎是一个“类属性” - REF:https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide
但是,我的 value 属性被视为“实例属性”,因为它被分配了一个不可变的值(None/Integer 等)
【问题讨论】:
-
去掉类变量声明
store = {}和value = None。您在构造函数中声明它们,这就足够了。
标签: python dictionary constructor static init