self.__class__.__missing__' 是什么意思
在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
的例子。