【问题标题】:Dictionary inside python class is being treated as a static object? [duplicate]python类中的字典被视为静态对象? [复制]
【发布时间】: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


【解决方案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的对象级变量,其中objObj类型的实例

【讨论】:

    【解决方案2】:

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

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

    最好的问候

    【讨论】:

      【解决方案3】:

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

      更多详情请参阅here

      【讨论】:

        猜你喜欢
        • 2014-03-03
        • 1970-01-01
        • 2021-06-25
        • 2013-08-19
        • 1970-01-01
        • 2015-08-01
        • 2010-10-15
        • 2015-08-28
        • 2012-10-18
        相关资源
        最近更新 更多