仅当通过点运算符访问时才会出现Dict AttributeError

时间:2017-09-15 10:59:45

标签: python dictionary

所以我正在制作一个这样的字典:

request = {"method": "get"}

当我尝试用

列出属性时
print list(request.keys())

我得到了我期望的东西:

['method']

我可以使用

访问method属性
print request['method']

我得到了我期望的东西:

get

但如果我试着

print request.method

我收到错误

  

AttributeError:'dict'对象没有属性'method'

为什么我使用.时出错,但在使用方括号时却没有?

3 个答案:

答案 0 :(得分:4)

这两个操作转换为不同的方法调用:

python中的Dictionary的API通过“下标接口”工作。意思是,期望通过get方法或[]索引访问其项目。

一个工作而另一个工作失败的原因是操作不等同。只有get[]工作的原因是由于python中的实现。

通过覆盖__getattr__

,可以轻松地模拟成员访问
class AttrDict(dict):
    def __getattr__(self, name):
        return self[name]

request = AttrDict({'method': 'get'})
method = request.method  # 'get'

答案 1 :(得分:2)

因为您无法通过这种方式使用键来获取字典中的值(dict.key dict["key"]相同 - 它在使用时会调用不同的方法,如图所示在@ Elisha的回答中。)

"method"不是属性,是指 "get"。在您的情况下,给定密钥的字典中获取值的唯一有效方法是request["method"]request.get("method", "defaultmethod")

希望这有帮助!

答案 2 :(得分:0)

点符号通常用于获取对象的属性。例如:

class Dog:    
    def __init__(self, name):
        self.name = name

d = Dog(name = 'Fuffy')

print d.name # 'Fuffy'

如果您希望通过key从词典中获取某个项目,则必须使用符号dict['key'],或者可能不太常见,

dict.get(key, default=None)

其中default(默认为None)是key不存在时返回的值。例如

request = {"method": "get"}
print request.get('method','foo') # get
print request.get('bar','foo') # foo