【问题标题】:Class with dictionary not getting initialized [duplicate]字典未初始化的类[重复]
【发布时间】:2018-05-02 14:40:17
【问题描述】:

我有一个带有字符串和字典的简单类。当我创建类的多个对象时,显然字典没有正确初始化。所有对象的字典都包含最后创建的对象的条目。代码是:

# a simple class with a string and a dictionary:
class Myclass:
    name = ""
    valuedict = {}

# a list for objects: 
mylist = []

# create 3 objects: 
for i in range(3):
    mc = Myclass()
    mc.name = str(i)
    mc.valuedict['name'] = str(i)
    mylist.append(mc)

# disply objects in list: 
for item in mylist:
    print("-----------------")
    print("name = ", item.name)
    print("name in dict = ", item.valuedict['name'])

输出是:

-----------------
name =  0
name in dict =  2
-----------------
name =  1
name in dict =  2
-----------------
name =  2
name in dict =  2

名称字符串如预期的那样是 0、1 和 2,但字典中的名称在所有 3 个对象中都是 2。问题出在哪里,如何解决?感谢您的帮助。

【问题讨论】:

  • 那么您希望MyClass 的每个实例在valuedict 中都具有唯一值吗?您需要将 def __init__(self): 方法添加到您的类并将它们指定为实例属性,例如self.valuedict = {}。值得阅读一些关于 OOP 的教程。

标签: python python-3.x class oop dictionary


【解决方案1】:

目前,valuedict 是一个类对象。我相信您要做的是拥有单独的实例,在这种情况下,您将需要一个构造函数(在 Python 中称为 __init__)。

修正后的类代码如下(self指类的实例)

class Myclass:
    def __init__(self):
        self.name = ""
        self.valuedict = {}

那么为什么name 的行为不一样呢?在第一个 for 循环中,您定义 name,您在其中访问 valuedict 的一个键,它不存在,因此您采用“下一个最好的事情”,类变量。 name 没有这个问题,因为你正在初始化它。可以在here 找到对此的更好解释。

【讨论】:

  • 好的。我现在明白了。我早些时候在文档中看到过它,但忘记在此处添加它。但是为什么name 在每个对象中都不同呢?对于所有对象,这也不应该是相同的吗?这里似乎确实存在差异。
  • 对于这种特定情况,这是因为您正在实际上定义了一个实例变量(尽管是隐式的)。对于字典,您首先要访问字典的键,该键在实例中不存在,因此我们从类中获取它,从而使其被共享。
  • @rnso 请参阅this answer 以获得比我更好的解释。
猜你喜欢
  • 2017-11-15
  • 2018-07-14
  • 1970-01-01
  • 2018-10-22
  • 2016-02-14
  • 2014-09-23
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多