Python 我怎么能从dict打电话给missing
我想从dict派生并覆盖缺少的方法。我想做一些事情,然后仍然调用它的超级函数。大概是这样的: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__' 当然
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
中创建子类。始终是您的选择,只是想提供一个替代方案