我想从dict派生并覆盖缺少的方法。我想做一些东西然后仍然调用它的超级功能。像这样:
class Foo(dict):
def __missing__(self, key):
print('missing {}'.format(key))
return super().__missing__(key)
然而,产生了:
AttributeError: 'super' object has no attribute '__missing__'
当然,我仍然可以使用以下方式制作一个有效的程序:
raise KeyError(key)
但我更愿意称之为超级功能。因为代码可以(或者可能在将来的python版本中)在super().__missing__
中执行,而不是引发KeyError。
答案 0 :(得分:7)
没有dict.__missing__
;只需将通话转至super().__missing__
(并提出KeyError
)即可。该方法是可选,没有默认实现。
或者,如果要正确支持多重继承,可以捕获AttributeError
异常:
class Foo(dict):
def __missing__(self, key):
print('missing {}'.format(key))
try:
return super().__missing__(key)
except AttributeError:
raise KeyError(key)
答案 1 :(得分:0)
collections.defaultdict
的子类,其中已经包含缺少方法。
https://docs.python.org/3/library/collections.html#collections.defaultdict
__missing__
(键)如果
default_factory
属性为None
,则会以键作为参数引发KeyError
异常。如果default_factory不是
None
,则调用它而不带参数 为给定的键提供默认值,插入此值 键的字典,并返回。如果调用
default_factory
引发异常,则此异常为 传播不变。此方法由dict类的
__getitem__()
方法调用 何时找不到所请求的密钥;无论它返回或加注是什么 然后由__getitem__()
返回或提出。请注意
__missing__()
__getitem__()
。这意味着get()
会像普通词典一样将None
作为默认值而不是default_factory
返回。