【问题标题】:dict AttributeError only when accessing via dot operatordict AttributeError 仅在通过点运算符访问时
【发布时间】:2023-04-07 01:05:01
【问题描述】:

所以我正在创建一个这样的字典:

request = {"method": "get"}

当我尝试使用

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

我得到了我所期望的:

['method']

我可以通过

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

我得到了我所期望的:

get

但如果我尝试

print request.method

我收到一个错误

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

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

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

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

    python 中的字典 API 通过“可下标的接口”工作。这意味着,它的项目预计将通过get 方法或通过[] 索引访问。

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

    通过覆盖__getattr__可以轻松地模拟成员访问:

    class AttrDict(dict):
        def __getattr__(self, name):
            return self[name]
    
    request = AttrDict({'method': 'get'})
    method = request.method  # 'get'
    

    【讨论】:

    • 如果. 转换为__getattribute__,我不清楚为什么覆盖__getattr__ 会起作用?
    • 我可能过于简单化了。在访问对象的任何属性之前调用__getattribute__,例如get 函数或keys 函数。另一方面,__getattr__ 仅在缺少请求的属性时调用。在示例中,__getattr__ 表示它不会隐藏dict 的内置函数。
    • 有道理。谢谢!
    【解决方案2】:

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

    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
    

    【讨论】:

      【解决方案3】:

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

      "method" 不是一个属性,它是一个 key 引用 value "get"。在给定键的情况下,从字典中获取值的唯一有效方法是 request["method"]request.get("method", "defaultmethod")

      希望这有帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 2012-03-05
        • 1970-01-01
        • 1970-01-01
        • 2019-10-20
        • 2011-02-01
        相关资源
        最近更新 更多