6
votes

Émouler la méthode List.insert () comme sous-classe de la liste de Python

J'essaie de construire une classe qui hérite des méthodes de la liste de Python, mais aussi des choses supplémentaires sur le dessus ... il est probablement plus facile de montrer du code à ce stade ...

from collections import MutableSequence
class HostList(MutableSequence):
    """A container for manipulating lists of hosts"""
    def __init__(self, data):
        super(HostList, self).__init__()
        if (data is not None):
            self._list = list(data)
        else:
            self._list = list()

    def __repr__(self):
        return "<{0} {1}>".format(self.__class__.__name__, self._list)

    def __len__(self):
        """List length"""
        return len(self._list)

    def __getitem__(self, ii):
        """Get a list item"""
        return self._list[ii]

    def __delitem__(self, ii):
        """Delete an item"""
        del self._list[ii]

    def __setitem__(self, ii, val):
        # optional: self._acl_check(val)
        return self._list[ii]
    def __str__(self):
        return str(self._list)
    def insert(self, ii, val):
        # optional: self._acl_check(val)
        self._list.insert(ii, val)
    def append(self, val):
        self.insert(len(self._list), val)


6 commentaires

Self = [] Ne fait pas ce que vous pensez.


super (hostlist, auto) .__ init __ (auto) ferait le tour. Ce que votre code est réaffecté la variable (argument) auto à [] .


__ getItem __ retournera un objet de liste si une tranche est spécifiée. Vous pouvez modifier l'initialisateur vers __ init __ (auto, l = aucun) qui utilisera une liste si fournie. Ensuite, dans __ getItem __ , si II est un objet SLICE, puis renvoyez hostlist (Self._List [II])


En outre, vous n'avez pas nécessairement de définir la méthode () , comme mutablaisequence le fait déjà pour vous, à condition que vous avez défini l'insertion () < / Code> Méthode (check hg.python.org/cpython/ Fichier / 3.4 / LIB / _Collections_abc.py # L711 Pour plus d'informations).


Pycharas me dit que vous avez manqué quelques méthodes abstraites: __ iter __ () et __ contient __ () .


Je ne suis pas sûr de comprendre pourquoi il se plaint ... STDLIB ''s MutaBleSequence hérit de séquence () , qui inclut le __ iter __ () et __ contient __ () méthodes.


4 Réponses :


6
votes

Utilisez isinstance pour vérifier vos objets pour voir s'ils sont Instances de hôte et utilisez Super ( par exemple super (hostlist, auto) .insert (...) ) Pour utiliser la fonctionnalité de la liste , plutôt que de le réimplanter vous-même.

Vous devriez vous retrouver avec quelque chose comme: xxx


1 commentaires

Encore mieux, définissez une méthode statique as_host (x) qui renvoie x s'il s'agit d'un hôte, sinon l'exception appropriée. Ensuite, les appels Super deviennent une doublure.



0
votes

Vous pouvez appeler la méthode de la liste à partir de votre méthode, avec super () . De cette façon, vous n'avez pas besoin de l'enflure avec les autres méthodes.


0 commentaires

3
votes

sauf si s'il y a une raison impérieuse pour que votre conteneur d'hostine d'hôte prend en charge complètement l'interface de conteneur mutable, je suggère d'utiliser un modèle A-un-un plutôt que IS-A. Vous aurez le fardeau supplémentaire de la consistance de type avec des opérations telles que la tranchée (renvoyer un conteneur d'hostlist plutôt qu'une liste).


0 commentaires

7
votes

Si vous pouvez éventuellement l'éviter, n'héritez pas de classes intégrées. (Vous peut , mais cela ne signifie pas que vous devrait sans raison vraiment convaincante)

Ces classes sont optimisées pour la vitesse et qui les hérite correctement assez fastidieuses, car vous finissez par avoir à remplacer presque tout.

héritage de collections.mutablesequence vous permet de mettre en œuvre quelques méthodes essentielles et d'obtenir une mise en œuvre robuste entièrement en vedette de l'API de séquence, sans toutes les bizarreries et les mises en garde qui viennent en héritage de Liste .


1 commentaires

Great Point +1 ... Après quelques luttes, je l'ai eu en train de travailler avec collections.Mutablequence ... merci!