Sea*_*ean 20 python counter dictionary ordereddictionary python-3.x
阅读如何super()工作,我遇到了关于如何创建有序计数器的这个方法:
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),)
Run Code Online (Sandbox Code Playgroud)
例如:
oc = OrderedCounter('adddddbracadabra')
print(oc)
OrderedCounter(OrderedDict([('a', 5), ('d', 6), ('b', 2), ('r', 2), ('c', 1)]))
Run Code Online (Sandbox Code Playgroud)
有人能够解释这是如何神奇地起作用的吗?
这也出现在Python文档中.
Roo*_*Two 30
OrderedCounter在OrderedDict文档中作为示例给出,无需覆盖任何方法即可工作:
class OrderedCounter(Counter, OrderedDict):
pass
Run Code Online (Sandbox Code Playgroud)
调用类方法时,Python必须找到要执行的正确方法.有一个定义的顺序,它在其中搜索称为"方法解析顺序"或mro的类层次结构.mro存储在属性中__mro__:
OrderedCounter.__mro__
(<class '__main__.OrderedCounter'>, <class 'collections.Counter'>, <class 'collections.OrderedDict'>, <class 'dict'>, <class 'object'>)
Run Code Online (Sandbox Code Playgroud)
当OrderedDict的实例调用__setitem__(),它在搜索顺序类:OrderedCounter,Counter,OrderedDict(在那里找到).所以一个声明就像oc['a'] = 0结束了呼唤 OrderedDict.__setitem__().
相反,__getitem__不会被mro中的任何子类覆盖,因此count = oc['a']处理dict.__getitem__().
oc = OrderedCounter()
oc['a'] = 1 # this call uses OrderedDict.__setitem__
count = oc['a'] # this call uses dict.__getitem__
Run Code Online (Sandbox Code Playgroud)
对于像oc.update('foobar').First 这样的语句,Counter.update()会发生一个更有趣的调用序列.Counter.update()使用self [elem] 的代码,它变成了一个调用OrderedDict.__setitem__().那个电话的代码dict.__setitem__().
如果基类反转,则不再有效.因为mro是不同的,并且调用了错误的方法.
class OrderedCounter(OrderedDict, Counter): # <<<== doesn't work
pass
Run Code Online (Sandbox Code Playgroud)
有关mro的更多信息,请参阅Python 2.3 文档.
| 归档时间: |
|
| 查看次数: |
7457 次 |
| 最近记录: |