【发布时间】:2016-05-28 12:38:04
【问题描述】:
我一直在阅读super() 的工作原理。我遇到了this recipe,它演示了如何创建有序计数器:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
'Counter that remembers the order elements are first seen'
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__,
OrderedDict(self))
def __reduce__(self):
return self.__class__, (OrderedDict(self),)
例如:
oc = OrderedCounter('adddddbracadabra')
print(oc)
OrderedCounter(OrderedDict([('a', 5), ('d', 6), ('b', 2), ('r', 2), ('c', 1)]))
有人能解释一下这是如何神奇地工作的吗?
这也出现在Python documentation。
【问题讨论】:
-
你不明白的地方能再具体一点吗?
-
我看到该类继承自 Counter 和 OrderedDict,但我看不出这些类是如何组合生成 OrderedCounter...我试图了解它的工作原理 - 因为例如,Counter 有什么特别之处吗?这是否有助于澄清我的问题?
-
基本上,作为一般的经验法则,避免多重继承(你的同事不会这样杀死你)......(粗略的 mixin 有点不同)
-
您在上面发布的示例缺少您链接到的文档中存在的 init 方法,我不确定,但我希望这是让它发挥作用很重要。您可以看到您覆盖了两个方法。任何未覆盖的方法都将从 Count 继承,如果不存在,则从 OrderedDict 继承。如果任何方法在它们的超类之一上,它就会变得有点棘手。正如@JoranBeasley 所说的“避免多重继承” - 复杂的继承树是你想要避免它的原因(它会导致意想不到的结果)。
-
是的,这一切都与
dict方法Counter实际覆盖/自定义有关。我不知道究竟是哪一个,但我怀疑Counter没有改变__setitem__和__iter__,所以你的新课程从OrderedDict得到这些,这足以给你有序的行为。跨度>
标签: python python-3.x dictionary counter ordereddictionary