2016-11-25 6 views
1

Ich bin neu bei Python. Ich möchte eine Sammlung von Wörterbüchern mit einigen meiner eigenen Methoden erstellen. Diese Frage ist zweiteilig:Python: Unterklasse oder Metaklasse für eine geordnete Sammlung von Wörterbüchern

  1. sollte ich eine Liste oder ein Wörterbuch als Vorlage für diesen Container verwenden?
  2. Wie würde ich das umsetzen? Ich habe dieses auf Stapelüberlauf verschiedene Antworten für das Vorschlagen collection.MutableSequence lesen oder Liste unter Verwendung usw.

    class OrderedSetOfDictionaries(<something>): 
        def __init__(self, **kwargs): 
        <maybe super().__init__()> 
    
        <do I have to redefine methods if I do not wish to change their behavior> 
    

Beispiel der gewünschten Datenstruktur

ordered_set_of_dictionaries = 
{ 
    "dictionary_1" : { 
         "key_1": value_1, 
         "key_2": value_2, 
         <etc> 
        }, 
    "dictionary_2" : { 
         "key_1": value_1, 
         "key_2": value_2, 
         <etc> 
        }, 
    "dictionary_3" : { 
         "key_1": value_1, 
         "key_2": value_2, 
         <etc> 
        }, 
    <etc> 

} 

ordered_set_of_dictionaries.last()

- ><dictionary_n>

ordered_set_of_dictionaries["dictionary_1"]["key_1"]

->value_1

etc

+0

Subklassifizieren von integrierten Typen ist selten erforderlich. Ich schlage vor, dass Sie eine Klasse schreiben, die eine Liste von was auch immer als ein Attribut enthält: bevorzugen Sie Aggregation zu Vererbung. – khelwood

+0

Ein Beispiel für das, was Sie erreichen möchten, wäre hilfreich – Alex

Antwort

2

Hier ist eine Möglichkeit, es durch Subklassen OrderedDict zu tun. Neben einer last() Funktion fügte ich auch first() und ith(i) Funktionen hinzu. ith(i) funktioniert ähnlich wie Indexierung von Listen.

from collections import OrderedDict 

class ord_dict_with_indexing(OrderedDict): 
    def __init__(self, *args): 
     super(ord_dict_with_indexing, self).__init__(*args) 

    def ith(self, i): 
     return self.__getitem__(list(self.keys())[i]) 

    def last(self): 
     return self.ith(-1) 

    def first(self): 
     return self.ith(0) 

Zum Beispiel:

d = ord_dict_with_indexing() 
d["dictionary_1"] = {"key_1":"value_1","key_2":"value_2"} 
d["dictionary_2"] = {"key_3":"value_3","key_4":"value_4"} 
d["dictionary_3"] = {"key_5":"value_1","key_2":"value_5"} 

>>> d.first() 
{'key_1': 'value_1', 'key_2': 'value_2'} 
>>> d.last() 
{'key_2': 'value_5', 'key_5': 'value_1'} 
>>> d.ith(1) 
{'key_3': 'value_3', 'key_4': 'value_4'} 
>>> d['dictionary_1']['key_1'] 
'value_1' 

Beachten Sie, dass die Reihenfolge, in der Reihenfolge angezeigt werden, dass die Elemente hinzugefügt werden.

Verwandte Themen