Frage

Ich mag einen benutzerdefinierten Satz erstellen, die automatisch Objekte in eine andere Form für die Speicherung in der Menge konvertieren (siehe einen Python-Wörterbuch als Schlüssel nicht verschachtelter verwenden) für den Hintergrund.

Wenn ich außer Kraft setzen add, remove, __contains__, __str__, update, __iter__ wird, dass ausreichend sein, die anderen Operationen richtig verhalten zu machen, oder muss ich etwas anderes außer Kraft setzen?

War es hilfreich?

Lösung

von collections abstrakten Klassen arbeiten, wie @ kaizer.se schon sagt, ist die geeignete Lösung in 2,6 (nicht sicher, warum Sie für den Super nennen - welche Funktionen werden Sie durch Eindämmen das kann nicht am besten, zu delegieren versuchen, anstatt Vererbung?!).

Es ist wahr, dass Sie nicht update bekommt - durch die abstrakten Methoden bereitstellt, sind Sie __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__ __sub__, __xor__, and isdisjoint bekommen (von collections.Set) und clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__ (von collections.MutableSet), das würde weit mehr als Sie erhalten von Subklassen set (wo Sie ‚d außer Kraft setzen müssen alle Methode von Interesse). Sie werden nur andere Set-Methoden zur Verfügung stellen müssen, die Sie wünschen.

Beachten Sie, dass die abstrakten Basisklassen wie collections.Set sind ein ziemlich anderes Tier aus konkreten Klassen, einschließlich builtins wie set und (in 2.6) gutem alten sets.Set, veralten, aber immer noch um (entfernt in Python 3). ABCs von erben sollen (und können dann einige Methoden von Ihnen synthetisieren, sobald Sie alle abstrakten Methoden implementieren, wie es sein muss) und in zweiter Linie auf „Register“ Klassen mit so sehen sie aus, als ob sie von ihnen geerbt, auch wenn sie es nicht tun (um isinstance mehr verwendbar und nützlich).

Hier ist ein funktionierendes Beispiel für Python 3.1 und 2.6 (ohne guten Grund 3.0 zu verwenden, da nur 3,1 hat Vorteile gegenüber es, kein Nachteil):

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

Andere Tipps

In Python 2.6:

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

Unterklasse collections.MutableSet und überschreiben die Methoden in der obigen Liste.

die Update-Methode selbst ist sehr einfach, da das absolute Minimum oben implementiert

def update(self, iterable):
    for x in iterable:
        self.add(x)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top