【发布时间】:2012-04-14 16:00:36
【问题描述】:
Raymond Hettinger showed 一种非常酷的组合集合类的方式:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
# if pickle support is desired, see original post
我想为 OrderedDict 和 defaultdict 做类似的事情。但是当然,defaultdict 有一个不同的__init__ 签名,所以它需要额外的工作。解决这个问题的最干净的方法是什么?我使用 Python 3.3。
我在这里找到了一个很好的解决方案:https://stackoverflow.com/a/4127426/336527,但我想也许从 defaultdict 派生可能会使这更简单?
【问题讨论】:
-
当我们谈到这个话题时,有人可以向我解释一下 OrderedDict 示例是如何在没有任何明确的
super-delegation 的情况下实际获得 OrderedDict 功能的吗?是因为super在Counter内的某处调用,而是通过OrderedDict重新路由,而不是像往常那样直接转到dict?或者只是什么? -
@KarlKnechtel 你的意思是
OrderedCounter,但这是个好问题。 -
@agf er,是的,完全正确。愚蠢的编辑超时...... :(
-
@KarlKnechtel 我认为答案是
Counter没有实现OrderedDict需要实现才能工作的任何dict方法,而dict是两者的基类Counter和OrderedDict,因此对OrderedCounter或Counter中的这些方法的实例的正常调用被委托给OrderedDict。
标签: python collections python-3.x multiple-inheritance