【问题标题】:Python class - create instance of nested dictionaryPython 类 - 创建嵌套字典的实例
【发布时间】:2020-10-22 10:53:53
【问题描述】:

我正在尝试创建将字典作为输入的类,然后将其用作同一个类的输入(有效地使用类方法创建嵌套字典):

这是我目前所拥有的:

class popl(object):
        def __init__(self,d):
            self.__dict__= d

dic = {'x':[1,2,3], 'y':[4,5,6]}
# Inner dict
inner = popl(dic)

现在我可以:inner.x 访问元素。 然后我希望能够创建一个由inner 组成的新字典outer,并将元素访问为:outer.inner.x

我试过了:

outer=popl(inner)

但我收到一个错误:

TypeError: __dict__ must be set to a dictionary, not a 'popl'

知道如何实现我想要的吗?我需要一个嵌套类吗?

【问题讨论】:

  • 包含内部字典的“外部”字典的键是什么?这个额外的课程需要什么?您已经可以在没有对象开销的情况下创建嵌套字典。
  • popl 接受字典,而不是 popl 对象。 popl(inner) 应该如何知道 inner 是键 "inner" 的值?
  • @gallen 外部字典的键将是“内部”。现在x 应该可以通过outer.inner.x 访问。这一切的原因是它比输入 external['inner']['x'] 更干净
  • @MisterMiyagi 好的,我真的是 python 新手!对不起,如果我的问题有点傻!那么我如何使用键inner 制作popl(inner)
  • 顺便说一句,不要这样做self.__dict__= d,这会破坏一个非常有用的优化(共享密钥命名空间字典...)。相反,使用self.__dict__.update(d) 此外,没有嵌套类在这里根本没有帮助。除了可能将一个类保留在另一个类命名空间中之外,它们实际上没有任何用途,但它们本身并没有真正提供任何功能

标签: python class dictionary


【解决方案1】:

您的问题的直接答案是:

class popl(object):
    def __init__(self, d):
        if isinstance(d, popl):
            self.__dict__ = { "inner": d.__dict__ }
        else:
            self.__dict__ = d

    def __str__(self):
        return str(self.__dict__)


dic = {'x':[1,2,3], 'y':[4,5,6]}
# Inner dict
inner = popl(dic)

outer = popl(inner)
print(outer)

# Output
>>> {'inner': {'x': [1, 2, 3], 'y': [4, 5, 6]}}

【讨论】:

  • 非常感谢您的帮助,但当我这样做时:print(outer.inner.x) 我收到了AttributeError: 'dict' object has no attribute 'x'
  • 这种访问器用于属性(如错误所示),仅在类/对象上。字典本身就是一个结构,因此不支持以这种方式访问​​。要获得您的要求,您需要创建一个自定义类,该类可以动态允许未知键的属性访问,这是完全没有必要的。您最好的解决方案是找到一种方法来利用现有的字典,而不是围绕内置结构创建一个全新的类。 dict[key][key] 的语法是 Python 的预期行为,更改它是不明智的。
  • 我同意object.attribute 正在访问object 类的属性。我想我必须想出一个类来基本上做以下事情:dic = {'x':[1,2,3], 'y':[4,5,6]} inner = popl(dic) outer={'inner':inner} outer=popl(outer)
  • “我想我必须想出一门课……”。我不明白这样做的原因。除了个人审美之外,想要完全重新发明使用字典的轮子的目的是什么?
  • 上瘾者(github.com/mewwts/addict)在这种情况下有用吗? /吉姆
猜你喜欢
  • 2023-01-18
  • 1970-01-01
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2015-07-18
相关资源
最近更新 更多