Python 我怎么能从dict打电话给missing

Python 我怎么能从dict打电话给missing,python,oop,python-3.x,dictionary,Python,Oop,Python 3.x,Dictionary,我想从dict派生并覆盖缺少的方法。我想做一些事情,然后仍然调用它的超级函数。大概是这样的: class Foo(dict): def __missing__(self, key): print('missing {}'.format(key)) return super().__missing__(key) 然而,它产生: AttributeError: 'super' object has no attribute '__missing__' 当然

我想从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()中执行。除了引发KeyError之外,还可以在
super()中执行;只需放弃对
super()。\uuuuu missing\uuuu
(并发出
KeyError
)的调用。该方法是可选的,没有默认实现

或者,如果希望正确支持多重继承,可以捕获
AttributeError
异常:

class Foo(dict):
    def __missing__(self, key):
        print('missing {}'.format(key))
        try:
            return super().__missing__(key)
        except AttributeError:
            raise KeyError(key)

collections.defaultdict
中的子类,该子类已具有一个缺少的方法

\uuuuu缺失\uuuuuu
(键) 如果
default\u factory
属性为
None
,则会引发一个
KeyError
异常,并将键作为参数。

如果默认工厂不是
None
,则调用它时不带参数 为给定键提供默认值,该值将插入 字典找钥匙,然后返回

如果调用
default\u factory
引发异常,则此异常为 传播没有改变

dict类的
\uuu getitem\uuuu()
方法调用此方法 当找不到请求的密钥时;无论它回报或提高的是什么 然后由
\uuu getitem\uuuu()
返回或引发

请注意,除此之外,任何操作都不会调用
\uuuu missing\uuu()
\uuu获取项目\uuuu()
。这意味着
get()


没有
dict.\uuuu缺少\uuuu
方法;如果您为dict子类提供了一个
\uuuuuuu missing\uuuuuuuu
,您应该自己返回一个值或引发一个错误,而不是试图将其委托给
dict
。仅放弃超级调用是不够的,从那时起,所有缺少的键都将得到
None
。@user2357112:我的想法是你提出
KeyError
,我来澄清一下。对不起,马丁,错了。我希望我也能得到一个评论(或者现在2个)。答案可能不像你的答案那样准确,但我认为它也可以作为OP的替代方案。周六,有人对我的答案进行了长达6行的抨击,因为它被选为答案,他也投了反对票……谢谢你的回答。我想你是对的,这只是我不得不接受的一种语言结构。我会接受你的回答。@mementum:很高兴我的怀疑没有根据!:-)有时候,人们会对自己的观点过于执着。谢谢你的回答。但实际上我更愿意从
dict
中创建子类。始终是您的选择,只是想提供一个替代方案