【问题标题】:what is the 'self.__class__.__missing__' mean'self.__class__.__missing__' 是什么意思
【发布时间】:2010-01-02 00:25:15
【问题描述】:

在 pinax Userdict.py 中:

def __getitem__(self, key):
        if key in self.data:
            return self.data[key]
        if hasattr(self.__class__, "__missing__"):
            return self.__class__.__missing__(self, key)

为什么它在self.__class__.__missing__ 上这样做。

谢谢

【问题讨论】:

    标签: python pinax


    【解决方案1】:

    here 呈现的 UserDict.py 模拟了内置的 dict,例如:

    >>> class m(dict):
    ...   def __missing__(self, key): return key + key
    ... 
    >>> a=m()
    >>> a['ciao']
    'ciaociao'
    

    正如您可以在子类化内置dict 时覆盖特殊方法__missing__ 来处理丢失的键一样,您也可以在子类化UserDict 时覆盖它。

    dict 的官方 Python 文档是 here,他们确实说:

    2.5 版新功能:如果 dict 定义了一个方法__missing__(), 如果 key key 不存在,则 d[key] 操作调用该方法 以 key key 作为参数。这 d[key] 操作然后返回或 提高返回或提高的任何东西 由__missing__(key) 调用,如果 密钥不存在。没有其他 操作或方法调用 __missing__()。如果未定义 __missing__(),则会引发 KeyError__missing__() 必须是方法;它不能是实例变量。为 例如,参见collections.defaultdict

    【讨论】:

      【解决方案2】:

      如果您想在 dict 中使用默认值(又名 __missing__),您可以查看集合模块中的 defaultdict

      from collections import defaultdict
      
      a = defaultdict(int)
      
      a[1] # -> 0
      a[2] += 1
      a # -> defaultdict(int, {1: 0, 2: 1})
      

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 2014-01-03
        • 2012-08-29
        • 1970-01-01
        相关资源
        最近更新 更多