所以我正在制作一个这样的字典:
request = {"method": "get"}
当我尝试用
列出属性时print list(request.keys())
我得到了我期望的东西:
['method']
我可以使用
访问method
属性
print request['method']
我得到了我期望的东西:
get
但如果我试着
print request.method
我收到错误
AttributeError:'dict'对象没有属性'method'
为什么我使用.
时出错,但在使用方括号时却没有?
答案 0 :(得分:4)
这两个操作转换为不同的方法调用:
request['method']
转换为__getitem__
request.method
转换为__getattribute__
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