使用点(.)访问字典键

5

我无法使用点(.)访问字典键,但是当我定义一个继承自dict的类时,我可以使用点(.)访问其键。有人能解释一下吗?

所以,当我运行这段代码时:

d = {'first_key':1, 'second_key':2}
d.first_key

I get this error:

'dict' object has no attribute 'first_key'

但是当我运行这个时:
class DotDict(dict):
    pass
d = DotDict()
d.first_key = 1
d.second_key = 2
print(d.first_key)
print(d.second_key)

I get this:

1
2

6
因为此时你只是在创建成员变量,而不是必要地添加到字典中(第二个示例中)。 - sshashank124
4
请在不继承dict的情况下测试您的示例。 - Klaus D.
6
这个问题并不应该遭受这么多的负评。它被正确地表述了。仅仅因为某些事情对某些人来说可能很明显,并不意味着对其他人也是如此。提问者甚至提供了他们对问题的探索。 - sshashank124
1
请将点赞/踩保留给问题的质量/格式,而不是基于内容的简单性/显而易见的错误。 - sshashank124
1
还可以参考这个关于字典AttributeError的问题:https://dev59.com/YHI_5IYBdhLWcg3wF_B3 - awesoon
显示剩余11条评论
3个回答

4
通过应用您的示例
class DotDict(dict):
    pass

d = DotDict()
d.first_key = 1
d.second_key = 2
print(d.first_key)
print(d.second_key)

你将实例参数first_keysecond_key设置到了你的DotDict类中,但并没有设置到字典本身。如果你把字典内容直接输出到屏幕上,就会看到这一点:

In [5]: d
Out[5]: {}

因此,它只是一个空的字典。您可以像访问普通字典一样访问字典:

In [1]: d={}

In [2]: d['first'] = 'foo'

In [3]: d['second'] = 'bar'

In [4]: d
Out[4]: {'first': 'foo', 'second': 'bar'}

1
感谢您的考虑。 - pythinker

2
在第一个案例中,您正在创建属于字典对象的键和值。而在第二个案例中,您正在创建类的属性,这与您继承的字典父类无关。

那是一个宝贵的观点。谢谢。 - pythinker

1
如果您想访问字典元素,需要通过键来访问。
d['first_key']

输出:

1

如果您想使用 (.) 访问,则请使用 get
使用 get 可以获取所需的值。
d = {'first_key':1, 'second_key':2}
print(d.get('first_key'))

输出:

1

关于class,你正在访问class的属性。因此,你需要使用(.)来访问。


@pythinker:这个很好用。我测试过了。 - user5777975
感谢您的帮助。 - pythinker
@pythinker:所以它起作用了。太好了。请确认答案,这会对其他人有帮助。 - user5777975

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接