所以我正在创建一个这样的字典:
request = {"method": "get"}
Run Code Online (Sandbox Code Playgroud)
当我尝试列出属性时
print list(request.keys())
Run Code Online (Sandbox Code Playgroud)
我得到了我所期望的:
['method']
Run Code Online (Sandbox Code Playgroud)
我可以访问该method属性
print request['method']
Run Code Online (Sandbox Code Playgroud)
我得到了我所期望的:
get
Run Code Online (Sandbox Code Playgroud)
但如果我尝试
print request.method
Run Code Online (Sandbox Code Playgroud)
我收到一个错误
AttributeError: 'dict' 对象没有属性 'method'
为什么我在.使用方括号时出现错误但不是?
这两个操作转化为不同的方法调用:
request['method'] 翻译成 __getitem__request.method 翻译成 __getattribute__python中的字典API通过“支持下标的接口”工作。意思是,它的项目应该通过get方法或[]索引来访问。
一个工作而另一个失败的原因是操作是不等价的。只有get和[]有效的原因是由于python中的实现。
通过覆盖可以轻松地模拟成员访问__getattr__:
class AttrDict(dict):
def __getattr__(self, name):
return self[name]
request = AttrDict({'method': 'get'})
method = request.method # 'get'
Run Code Online (Sandbox Code Playgroud)