Работа с абстрактными классами collections, как предлагает @ kaizer.se, является подходящим решением в 2.6 (не уверен, почему вы хотите вызвать super - какие функции вы пытаетесь делегировать, которые не могут быть лучше реализованы путем сдерживания, а не наследования ?! ).
Это правда, что вы не получаете update - предоставляя абстрактные методы, вы получаете __le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__ __sub__, __xor__, and isdisjoint (от collections.Set) плюс clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__ (от collections.MutableSet), что намного больше, чем вы получили бы от подкласса set (где у вас было бы чтобы переопределить каждый интересующий метод). Вам просто нужно будет предоставить другие методы, которые вы хотите.
Обратите внимание, что абстрактные базовые классы, такие как collections.Set, сильно отличаются от конкретных классов, включая встроенные функции, такие как set и (в 2.6) старый добрый sets.Set, устаревшие, но все еще присутствующие (удалены в Python 3). ABC предназначены для наследования (и могут затем синтезировать некоторые методы от вас, как только вы реализуете все абстрактные методы, как вы должны) и, во-вторых, для «регистрации» классов, чтобы они выглядели так, как будто они унаследованы от них, даже если они не (чтобы сделать isinstance более полезным и полезным).
Вот рабочий пример для Python 3.1 и 2.6 (нет веских причин для использования 3.0, поскольку 3.1 имеет только преимущества перед ним, без недостатков):
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
person
Alex Martelli
schedule
26.10.2009