2014-09-08 4 views
1

J'ai une classe qui entoure python deque de collections. Quand je vais créer un deque x=deque(), et je veux faire référence à la première variable ....Structure de données Python d'indexation personnalisée

In[78]: x[0] 
Out[78]: 0 

Ma question est de savoir comment utiliser le [] pour le référencement dans l'emballage exemple suivant

class deque_wrapper: 
    def __init__(self): 
     self.data_structure = deque() 

    def newCustomAddon(x): 
     return len(self.data_structure) 

    def __repr__(self): 
     return repr(self.data_structure) 

à savoir, continue d'exemple ci-dessus:

In[75]: x[0] 
Out[76]: TypeError: 'deque_wrapper' object does not support indexing 

Je souhaite personnaliser mon propre référencement, est-ce possible?

+0

Au lieu de demander [un séparé question pour chaque méthode nécessaire pour émuler un 'deque'] (http://stackoverflow.com/questions/25716437/custom-python-data-structure), vous devriez parcourir le [Data model] (https: //docs.python .org/3/reference/datamodel.html # special-method-names) section des docs (à laquelle vous avez maintenant donné des liens dans les deux questions) Presque tout ce que vous demanderez probablement sera là – abarnert

+0

Voir aussi ['collections.abc.MutableSequence'] (https://docs.python.org/3/libr ary/collections.abc.html). Si vous en héritez et que vous implémentez les méthodes listées dans le tableau, cela vous donnera automatiquement toutes les autres méthodes que 'deque',' list' et les types similaires ont. (Si vous êtes en Python 2.x, ça s'appelle 'collections.MutableSequence', pas' abc' ... mais si vous êtes en 2.x, vous ne devriez pas déclarer une classe sans bases comme celle-ci, comme quelqu'un sinon expliqué sur votre question précédente.) – abarnert

Répondre

4

Vous voulez mettre en œuvre le __getitem__ method:

class DequeWrapper: 
    def __init__(self): 
     self.data_structure = deque() 

    def newCustomAddon(x): 
     return len(self.data_structure) 

    def __repr__(self): 
     return repr(self.data_structure) 

    def __getitem__(self, index): 
     # etc 

Chaque fois que vous faites my_obj[x], Python fait appel my_obj.__getitem__(x).

Vous pouvez également envisager d'implémenter le __setitem__ method, le cas échéant. (Lorsque vous écrivez my_obj[x] = y, Python fait fonctionner my_obj.__setitem__(x, y).

La documentation sur Python data models contiendra plus d'informations sur les méthodes que vous devez mettre en œuvre afin de réaliser des structures de données personnalisées en Python.

+0

Si vous allez implémenter '__getitem__' et' __setitem__', à moins que vous n'ayez une collection explicitement-fixed-size, vous voudrez probablement aussi '__delitem__' (et probablement' insert' et "append" et ainsi de suite, aussi). – abarnert