2012-03-31 75 views
11

雷蒙德赫廷傑showed一個非常酷的方式集合類組合:子類和defaultdict

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派生出來可能會讓這更簡單?

+3

雖然我們的話題,可有人向我解釋如何OrderedDict例子實際上得到OrderedDict功能沒有任何明確的超級代表團到那個班?是否是因爲'Counter'中的'super'調用通過'OrderedDict'重新路由,而不是像他們通常那樣直接轉到'dict'?或者只是什麼? – 2012-03-31 01:02:58

+0

@KarlKnechtel你的意思是'OrderedCounter',但是很好的問題。 – agf 2012-03-31 01:18:34

+0

@呃,呃,確切地說。愚蠢的編輯超時...... :( – 2012-03-31 01:19:30

回答

7

OrderedDict繼承,因爲在你連接的答案是最簡單的方法。實現有序存儲比從工廠函數獲取默認值更有用。

您需要爲defaultdict實施的一點是自定義__init__邏輯和極其簡單的__missing__

如果你不是從defaultdict繼承時,必須委託或重新實現至少__setitem____delitem____iter__重現有序運行。您仍然需要在__init__中進行設置工作,但您可能會繼承或根據您的需要忽略一些其他方法。

看看the original recipeany of the others linked to from another Stack Overflow question會發生什麼。

3

我已經找到一種方法來繼承他們兩個,但不能確定是否有錯誤:

class OrderedDefaultDict(defaultdict, OrderedDict): 
    def __init__(self, default, *args, **kwargs): 
     defaultdict.__init__(self, default) 
     OrderedDict.__init__(self, *args, **kwargs) 
+0

這不會使兩個內部字典? – leewz 2014-08-04 05:33:30

+0

哦,我明白了。閱讀原始問題中的鏈接文章。 – leewz 2014-08-04 07:22:00