Überwiegendes Satz Methoden in Python
-
06-07-2019 - |
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?
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)