2009-10-26 5 views
1

Je veux créer un ensemble personnalisé qui vous permet de convertir automatiquement les objets sous une forme différente pour le stockage dans l'ensemble (voir Using a Python Dictionary as a key non-nested) pour le fond.méthodes set prépondérants en Python

Si j'Override add, remove, __contains__, __str__, update, __iter__, sera-ce suffisant pour que les autres opérations se comportent correctement, ou dois-je remplacer toute autre chose?

+0

@Casebash: S'il vous plaît ne pas commenter votre question . Même "bonne suggestion" est - à la longue - assez bête. D'autres personnes veulent votre * question * et la * réponse * choisie sans beaucoup de choses moelleuses. –

Répondre

7

travail des classes abstraites de collections, comme @ kaizer.se suggère, est la solution appropriée 2.6 (non bien sûr, pourquoi voulez-vous appeler super - quelle fonctionnalité essayez-vous de déléguer qui ne peut pas être mieux faite par confinement plutôt que par héritage?!).

Il est vrai que vous ne recevez pas update - en fournissant les méthodes abstraites, vous obtenez __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__ __sub__, __xor__, and isdisjoint (de collections.Set) plus clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__ (de collections.MutableSet), qui est beaucoup plus que vous obtenez de sous-classement set (où vous devez remplacer par méthode d'intérêt). Vous devrez juste fournir d'autres méthodes que vous désirez.

Notez que les classes de base abstraites comme collections.Set sont une bête assez différente des classes concrètes, y compris builtins tels que set et (2.6) bon vieux sets.Set, mais désapprouvée toujours autour (enlevé en Python 3). Les ABC sont censés hériter de (et peuvent ensuite synthétiser certaines méthodes de vous une fois que vous avez implémenté toutes les méthodes abstraites, comme vous devez) et secondairement à "enregistrer" les classes avec comme elles semblent hériter d'elles même quand elles ne le font pas. (pour rendre isinstance plus utile et utile).

Voici un exemple de travail pour Python 3.1 et 2.6 (aucune bonne raison d'utiliser 3.0, la version 3.1 n'a que des avantages sur elle, aucun inconvénient):

import collections 

class LowercasingSet(collections.MutableSet): 
    def __init__(self, initvalue=()): 
    self._theset = set() 
    for x in initvalue: self.add(x) 
    def add(self, item): 
    self._theset.add(item.lower()) 
    def discard(self, item): 
    self._theset.discard(item.lower()) 
    def __iter__(self): 
    return iter(self._theset) 
    def __len__(self): 
    return len(self._theset) 
    def __contains__(self, item): 
    try: 
     return item.lower() in self._theset 
    except AttributeError: 
     return False 
+2

Il peut être généralisé à l'aide 'clé (item)' au lieu de 'item.lower()' partout -> 'KeySet ("Aa", key = operator.methodcaller ('inférieure'))'. – jfs

+0

Pourquoi sous-classez-vous 'Set' et non' MutableSet'? Quelqu'un d'autre que moi pense qu'il est très déroutant que le module des collections soit un mélange de "vraies" collections (deque) et ABCs? – u0b34a0f6ae

+0

Il convient de noter que 'set' n'est pas la même chose que' set' – Casebash

1

En Python 2.6:

import collections 
print collections.MutableSet.__abstractmethods__ 
# prints: 
# frozenset(['discard', 'add', '__iter__', '__len__', '__contains__']) 

sous-classe collections.MutableSet et remplacer les méthodes de la liste ci-dessus.

la méthode de mise à jour lui-même est très facile, étant donné que le strict minimum ci-dessus est mis en œuvre

def update(self, iterable): 
    for x in iterable: 
     self.add(x) 
+0

Quand je fais cela, je ne suis pas la méthode de mise à jour – Casebash

+0

plus je ne peux pas appeler super (en utilisant Python 3.0) – Casebash

+1

@Casebash: S'il vous plaît inclure les informations Python 3.0 dans la question, pas un commentaire à une réponse. –

Questions connexes