self.__class__.__missing__' 是什么意思

1 投票
2 回答
2707 浏览
提问于 2025-04-15 17:32

在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__上会这样做呢?

谢谢

2 个回答

0

如果你想在字典里使用默认值(也就是__missing__),可以看看来自collections模块的defaultdict

from collections import defaultdict

a = defaultdict(int)

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

这里提到的 UserDict.py 模拟了 Python 内置的 dict,所以你可以这样理解:

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

就像你在自定义一个新的字典类(也就是从内置的 dict 继承)时,可以重写一个特殊的方法 __missing__ 来处理找不到的键一样,当你从 UserDict 继承时,也可以重写这个方法。

关于 dict 的官方文档可以在 这里找到,里面提到:

在 2.5 版本中新增:如果一个 dict 的子类定义了一个方法 __missing__(),当你尝试访问一个不存在的键时,d[key] 这个操作会调用这个方法,并把那个键作为参数传进去。然后,d[key] 会返回这个 __missing__(key) 调用的结果,或者如果这个键不存在,就会抛出一个错误。如果没有定义 __missing__(),那么就会抛出 KeyError 错误。__missing__() 必须是一个方法,不能是一个实例变量。想要了解更多,可以看看 collections.defaultdict 的例子。

撰写回答