collections正如@ kaizer.se所建议的那样,从的抽象类进行工作是2.6中的适当解决方案(不确定为什么要调用super-
您试图委托哪种功能最好通过包含约束而不是继承来完成? !)。
的确,您不会得到
update-通过提供抽象方法,您确实获得了
__le__, __lt__, __eq__, __ne__, __gt__,__ge__, __and__, __or__ __sub__, __xor__, and isdisjoint(from
collections.Set)加
clear, pop, remove, __ior__, __iand__, __ixor__, and__isub__(from
collections.MutableSet),这远远超过了从子类化中获得的价值
set(在子类化中,您必须重写
每种 感兴趣的方法)。您只需要提供所需的其他设置方法即可。
请注意,像这样的抽象基类与
collections.Set具体类是完全不同的野兽,包括诸如
setand和(在2.6中)good old
sets.Set,不推荐使用但仍在周围(在Python
3中已删除)的内置类。ABC是要从中继承的(一旦实现所有抽象方法,就可以从您那里合成一些方法),其次要向其“注册”类,这样即使它们没有继承,它们看起来也好像是从它们继承的(以使其
isinstance更加有用和有用)。
这是一个适用于Python 3.1和2.6的工作示例(没有充分的理由使用3.0,因为3.1仅比它有优势,而没有劣势):
import collectionsclass 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



