Работа с абстрактными классами 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