所以我正在创建一个这样的字典:
request = {"method": "get"}
当我尝试用
列出属性时print list(request.keys())
我得到了我所期望的:
['method']
而且我可以访问 method 属性
print request['method']
我得到了我所期望的:
get
但如果我尝试
print request.method
我得到一个错误
AttributeError: 'dict' object has no attribute 'method'
为什么我在使用 . 时会出错,但在使用方括号时却不会?
请您参考如下方法:
这两个操作转化为不同的方法调用:
request['method']转换为__getitem__request.method翻译成__getattribute__
Python 中的字典 API 通过“支持下标的接口(interface)”工作。也就是说,它的项应该通过 get 方法或通过 [] 索引访问。
一个有效而另一个失败的原因是操作不等同。只有 get 和 [] 起作用的原因是 python 中的实现。
通过覆盖 __getattr__ 可以很容易地模拟成员访问:
class AttrDict(dict):
def __getattr__(self, name):
return self[name]
request = AttrDict({'method': 'get'})
method = request.method # 'get'
